Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Redis 为什么好用?

Redis 为什么好用?

作者头像
CSDN技术头条
发布于 2019-11-19 07:36:17
发布于 2019-11-19 07:36:17
6320
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条

一、导言

如果你从来没使用过 Redis 数据库,那你肯定会问,为什么我们要学 Redis数据库,我只使用 MySQL 或 Oracle 就够了。其实 Redis 虽叫数据库,可又不是传统意义上的关系型数据库,Redis 是一个高性能的 Key-value 数据库。

首先我们先来讲一下 Redis 的历史。Redis 其实是作者 Salvatore Sanfilippo 为了解决实际问题而创造出来的。当时作者 Salvatore 有这么一个需求,就是多个网站不断向服务器发送页面,而服务器需要为每个网站保存一定数量的最新页面记录,同时通过网页将数据实时给用户看到。

但是无论 Salvatore 如何优化,都很难在关系数据库里让小虚拟机处理大负荷的负载。最终他打算自己写一个内存数据库,能对列表的两端执行常数时间复杂度的弹出和推入操作,并加上子进程的持久化操作,于是 Redis 就诞生了。

到了今天,Redis 已经进入了成熟期。数以千计的开发者都在开发和使用这个数据库,Redis 拥有非常完善的文档。我记得第一次使用 Redis,是为了在保存有数十百万用户的关系数据库里对某个条件进行查询。大家知道,要想在几百万用户中找到某条数据,是很难通过关系数据库在十几秒查询到的。于是我选择了 Redis,在不断优化后每次操作可以控制在 1 秒钟甚至更短,带给我相当大的震撼。

本教程不但教给你一些基本的使用,同时也会根据我多年总结的技巧解决日常生产环境上优化和排错的问题。特别是后期的数据库优化和集群的讲解,希望对各位进行 Redis 开发有一定帮助。

二、认识 Redis

在 Redis 之前,很多互联网公司会使用 MySql + Memcached 架构,这个架构虽然适合于海量数据存储,但随着业务的增加,会出现很多问题,例如,MySQL 数据库经常拆表,导致 Memcached 也不断扩容;同步问题;命中率低,导致直接穿透 Memcached 进入 DB 查询,DB资源池是有限的,进而宕机。这些问题都会导致Memcached其实并不好用。

Redis 就在这种时代背景中产生,你会发现 Memcached 遇到的问题都被 Redis 给解决了。如果你用过 Memcached,你就会感受到 Redis 绝对不是简单的 Key-value 数据,还有 list、set、哈希等各种数据类型的存储,同时支持冷热备份和主从复制,不但解决了数据库的容错,还能轻易地将数据分布到多个 Redis 实例中。

那么 Redis 有哪些具体特性呢?大致可分为如下八大特性。

特性一,速度极快。官方给出的数据是 10 万次 ops 的读写,这主要归功于这些数据都存在于内存中。由于 Redis 是开源的,当你打开源代码,就会发现 Redis 都是用 C 语言写的,C 语言是最接近计算机语言的代码,而且只有区区 5 万行,保证了 Redis 的速度。同时一个 Redis 只是一个单线程,其真正的原因还是因为单线程在内存中是效率最高的。

特性二,持久化。Redis 的持久化可以保证将内存中的数据每隔一段时间就保存于磁盘中,重启的时候会再次加载到内存。持久化方式是 RDB 和 AOF。

特性三,支持多种数据结构分别支持哈希、集合、BitMaps,还有位图(多用于活跃用户数等统计)、HyperLogLog(超小内存唯一值计数,由于只有 12K,是有一定误差范围的)、GEO(地理信息定位)。

特性四,支持多种编程语言。支持 Java、PHP、Python、Ruby、Lua、Node.js。

特性五,功能丰富。如发布订阅、Lua 脚本、事务、Pipeline(管道,即当指令到达一定数量后,客户端才会执行)。

特性六,简单。不依赖外部库、单线程、只有 23000 行 Code。

特性七,主从复制。主节点的数据做副本,这是做高可用的基石。

特性八,高可用和分布式。Redis-Sentinel(v2.8)支持高可用,Redis-Cluster(v3.0)支持分布式。

那么 Redis 用在哪些场景呢?

Redis 最大的作用是增加你原来的访问性能问题,试想如果项目已经搭建好,这个项目一般是不太可能更换的。但是 Redis 独特的存在是只需要增加一层,把常用的数据存放在 Redis 即可。你在开发环境中使用 Redis 功能,但却不需要转到 Redis。

无论是什么架构,你都可以将 Redis 融入项目中来,这可以解决很多关系数据库无法解决的问题。比如,现有数据库处理缓慢的任务,或者在原有的基础上开发新的功能,都可以使用 Redis。接下来,我们一起看看 Redis 的典型使用场景。

1. 缓存系统。这是 Redis 使用最多的场景。Redis 能够替代 Memcached,让你的缓存从只能存储数据变得能够更新数据,因此你不再需要每次都重新生成数据。毫无疑问,Redis 缓存使用的方式与 Memcached 相同。网络中总是能够看到这个技术更新换代,Redis 的原生命令,尽管简单却功能强大,把它们加以组合,能完成的功能是无法想象的。当然,你可以专门编写代码来完成所有这些操作,但 Redis 实现起来显然更为轻松。

2. 计数器。如转发数、评论数,有了原子递增(Atomic Increment),你可以放心的加上各种计数,用GETSET重置,或者是让它们过期。目前新浪是号称史上最大的 Redis 集群。

比如,你想计算出最近用户在页面间停顿不超过 30 秒的页面浏览量,当计数达到比如 10 时,就可以显示提示。再比如,如果想知道什么时候封锁一个 IP 地址,INCRBY命令让这些变得很容易,通过原子递增保持计数;GETSET用来重置计数器;过期属性用来确认一个关键字什么时候应该删除。

3. 消息队列系统。虽然 Kafka 更强,但是简单的可以使用 Redis。运行稳定并且快速,支持模式匹配,能够实时订阅与取消频道。

Redis 还有阻塞队列的命令,能够让一个程序在执行时被另一个程序添加到队列。你也可以做些更有趣的事情,比如一个旋转更新的 RSS Feed 队列。

4. 排行榜及相关问题。实际就是一种有序集合。对于 Redis 来说,如果你要在几百万个用户中找到排名,其他数据库查询是非常慢的,因为每过几分钟,就会有几百万个不同的数据产生变化,但是 Redis 却可以轻松解决。

排行榜(Leader Board)按照得分进行排序。ZADD 命令可以直接实现这个功能,而 ZREVRANGE 命令可以用来按照得分获取前 100 名的用户,ZRANK 可以用来获取用户排名,非常直接而且操作容易。

5. 社交网络。Redis 可以非常好地与社交网络相结合,如新浪微博、Twiter 等,比如 QQ 和用户交互的时候,用户和状态消息将会聚焦很多有用的信息,很多交互如实时聊天就是通过 Redis 来实现的。

6. 按照用户投票和时间排序。Reddit 的排行榜,得分会随着时间变化。LPUSH 和 LTRIM 命令结合运用,把文章添加到一个列表中。一项后台任务用来获取列表,并重新计算列表的排序,ZADD 命令用来按照新的顺序填充生成列表。列表可以实现非常快速的检索,即使是负载很重的站点。

7. 过期项目处理。通过 Unix 时间作为关键字,用来保持列表能够按时间排序。对 current_time 和 time_to_live 进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用 ZRANGE...WITHSCORES 进行查询,删除过期的条目。

8. 实时系统。使用位图来做布隆过滤器,例如实现垃圾邮件过滤系统的开发变的非常容易。

综上所述, Redis 的应用是非常广泛的,而且在实际使用中是非常有价值的。你可以让网站向 100 万用户推荐新闻、可以实时显示最新的项目列表、在游戏中实时获得排名、获得全球排名等等。Redis 的出现,解决了传统关系数据库的短板,让开发变的更加简单和高效,大大提高了开发效率,也在用户体验上获得更加实时的体验。随着 Redis 的使用越来越广泛,将会有更多的开发者加入 Redis 的使用和开发上来。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GitChat精品课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis学习札记
Redis支持两种持久化方式,一种是RDB方式(快照:根据指定的规则“定时”将内存中的数据存储在硬盘上),另一种是AOF方式(在每次执行命令后都将命令本身记录下来)。Redis允许同时开启RDB和AOF。
阿杜
2018/08/06
5350
Redis学习札记
Redis缓存设计原理
Redis是一个远程内存数据库(非关系型数据库),性能强劲,具有复制特性以及解决问题而生的独一无二的数据模型
JavaEdge
2021/02/23
3290
Redis缓存设计原理
Redis笔记(七):Redis应用场景
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
朝雨忆轻尘
2019/06/19
5950
零基础入门Redis,这篇够了!
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
大数据和云计算技术
2018/07/26
7830
零基础入门Redis,这篇够了!
深入分析Redis特点及应用场景Redis的特点:Redis的优势:Redis与其他key-value存储有什么不同?Redis应用场景2. 删除与过滤3. 排行榜相关
在Web应用中,“列出最新的回复”之类的查询非常普遍,这通常会带来可扩展性问题。这令人沮丧,因为项目本来就是按这个顺序被创建的,但要输出这个顺序却不得不进行排序操作。
desperate633
2018/08/22
3.4K0
Redis的8大应用场景
Redis开创了一种新的数据存储思路。使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。
葆宁
2019/04/19
16.7K0
Redis面试(一):基础考点
Redis 本质上是一个 Key-Value 类型的内存数据库,很像 Memcached,整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据 flush 到硬盘上进行保存。
传说之下的花儿
2023/09/20
3290
Redis面试(一):基础考点
springboot实战之nosql整合(redis篇)
关于redis的内容,我之前已经分享过了很多了,今天这篇算是为了springboot nosql整合中的凑数篇吧,哈哈,虽然这么说,但如果点进来了,蛮看下,说不定会有一些新发现
lyb-geek
2019/10/10
8380
快速入门Redis系列(1)——详细介绍及环境搭建
接下来的几天,博主将开始更Redis系列的博客,希望大家多多支持~本篇博客作为Redis系列第一篇,为大家带来的是Redis介绍及环境安装。
大数据梦想家
2021/01/27
4560
快速入门Redis系列(1)——详细介绍及环境搭建
Redis能干啥?细看11种Web应用场景
下面列出11种Web应用场景,在这些场景下可以充分的利用Redis的特性,大大提高效率。
全栈程序员站长
2022/07/07
5510
Redis特性和应用场景
Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。
MonroeCode
2018/01/10
1.4K0
Redis特性和应用场景
告诉你 Redis 是一个牛逼货
Redis 是一个 Key-Value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、 list(链表)、 set(集合)和 zset(有序集合)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
芋道源码
2018/07/31
7030
快速认识Redis(一)
不好意思哈~ 各位你们的Redis迟到了!!!!!! 好了废话不多说开更!!!!!!
刘浩的BigDataPath
2021/04/13
3230
Java大数据:分布式存储Redis初级入门
在Java大数据当中,Redis作为数据存储的一种的解决方案,主流运用很多。Redis可作为数据库、缓存或者消息代理,从内存加载数据,相比传统的数据库解决方案,具有更快的读写性能。今天我们就来讲讲,Java大数据分布式缓存的Redis入门基础。
成都加米谷大数据
2020/11/12
5960
Java大数据:分布式存储Redis初级入门
[Redis]Redis 概述及基本使用规范.
1 nosql的简介 1.1 nosql简介 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,如: 1.1.1 对数据库高并发读写的需求 网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上千万次SQL写数据请求,硬盘IO就已经
一枝花算不算浪漫
2018/05/18
1.3K0
Redis应用场景
Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现。
黄规速
2022/04/15
1.1K0
Redis应用场景
Redis的相关问题总结
Redis 是一个基于内存的高性能key-value数据库。很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。它的优点如下:
全栈程序员站长
2022/07/08
2800
非常值得一看的35个Redis面试题总结(二)
在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。
互扯程序
2019/07/10
1.3K0
Redis缓存技术及应用场景案例
    Remote Dictionary Server(Redis) 是一个开源的由Salvatore Sanfilippo使用ANSI C语言开发的key-value数据存储服务器。其值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型,所以它通常也被称为数据结构服务器。
动力节点Java培训
2019/06/12
1.5K0
既然有Map了,为什么还要有Redis?
String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。
科技新语
2023/03/10
6760
相关推荐
Redis学习札记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档