一.背景引入
刚接触 Redis 的人,最常问的一句话是:redis到底能解决什么问题,为什么大家都用它。要理解这一点,我们应该先从它的历史聊起,2008 年,作者 Salvatore Sanfilippo 在开发一个叫 LLOOGG 的网站时,需要一个高性能的队列功能。他最开始用 MySQL 实现,但无论怎么优化 SQL,性能都提不上去,加上当时资金有限,于是干脆自己动手,写了一个专门给 LLOOGG 用的数据库就是 Redis 的前身。
它的使用范围有多广?从 Redis 官方公司的统计看,国外有 Twitter、Instagram、Stack Overflow、GitHub,国内按体量算,新浪微博可以说是全球最大的 Redis 使用者,阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会也都在用。甚至连 ELK 这类开源技术,都把 Redis 作为组件中重要的一环。所以到了今天,熟练使用和运维 Redis,基本成了开发运维人员的必备技能。
二.核心原理
Redis 本质是一个基于键值对(key-value)的 数据库。和很多键值对数据库不同的是,它里面的 "值" 不只是字符串,而是可以由 string、hash、list、set、zset、Bitmaps、HyperLogLog、GEO 等多种数据结构和算法组成。这个名字本身也有含义 ——REmote Dictionary Server(远程字典服务),字典式的组织方式决定了它的灵活。
Redis 之所以受到如此多公司的⻘睐靠的是一整套特性。官方归纳下来一共 8 个:速度快、基于键值对的数据结构服务器、功能丰富、简单稳定、客户端语言多、持久化、主从复制、支持高可用和分布式。
下面让我们分别从这8个方面入手
1.速度快
正常情况下,Redis执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到10万/秒,当 然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了Redis如此 之快,可以⼤概归纳为以下四点:
1. Redis的所有数据都是存放在内存中的,下图是⾕歌公司2009年给出的各层级硬件执⾏速度,所 以把数据放在内存中是Redis速度快的最主要原因。

2.Redis是⽤C语⾔实现的,⼀般来说C语⾔实现的程序“距离”操作系统更近,执⾏速度相对会 更快。
3.Redis使⽤了单线程,预防了多线程可能产⽣的竞争问题。 Redis在6.0版本引⼊了多线程机制,但主要也是在处理⽹络和IO,不涉及到数据命令,即命令 的执⾏仍然采⽤了单线程模式。
4.作者对于Redis源代码可以说是精打细磨,曾经有⼈评价Redis是少有的集性能和优雅于⼀⾝的开 源代码。
2. 基于键值对的数据结构服务器
⼏乎所有的编程语⾔都提供了类似字典的功能,例如C++⾥的map、Java⾥的map、Python⾥ 的dict等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是, Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开 发,同时也能提⾼开发效率。Redis的全程是REmoteDictionaryServer,它主要提供了5种数据结 构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(orderedset/ zet),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的”数据结 构“,并且随着LBS(LocationBasedService,基于位置服务)的不断发展,Redis3.2.版本种加⼊ 有关GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意 思”的应⽤。
3.功能丰富
键过期可以用来做缓存;发布订阅可以用来做消息系统;支持 Lua 脚本,可以用它创造新的命令;提供简单的事务,能一定程度保证事务特性;还提供 Pipeline,把一批命令一次性传给服务端,减少网络开销。
4.简单稳定
早期源码只有 2 万行左右,3.0 加了集群后约 5 万行,相比很多 NoSQL 数据库少得多,普通开发运维人员可以 "吃透"。而且它不依赖操作系统的类库(不像 Memcache 依赖 libevent),事件处理是自己实现的。稳定性也够,大规模使用中很少因为自身 BUG 宕掉。
5.客户端语言多
因为提供的是简单的 TCP 通信协议,几乎主流语言都有客户端,C、C++、Java、PHP、Python、NodeJS 等。
6.持久化
数据全放内存,天然就有断电、机器故障导致丢失的风险。Redis 提供 RDB 和 AOF 两种方式,把内存数据保存到硬盘,保证数据不因断电丢失。
下图为Redis内存到硬盘的持久化示意图:

7.主从复制
数据全放内存,天然就有断电、机器故障导致丢失的风险。Redis 提供 RDB 和 AOF 两种方式,把内存数据保存到硬盘,保证数据不因断电丢失。
下图为Redis主从复制架构示意图:

8. 高可用和分布式
从服务器 Slave Redis 提供了⾼可⽤实现的Redis哨兵,能够保证Redis结点的故障发现和故 障⾃动转移。也提供了Redis集群,是真正的分布式实现,提供了⾼可⽤、读写和 容量的扩展性
三.使用场景:Redis 能做什么,不能做什么
能做的典型场景有五类:
1.缓存:这是几乎所有大型网站的标配。合理用缓存既能加速访问,又能降低后端数据源压力。Redis 提供键过期时间设置,还能灵活控制最大内存和内存溢出后的淘汰策略。
2.排行榜系统:网站里按热度、按发布时间、按复杂维度计算的排行榜,用列表和有序集合这两种结构可以很方便地构建。
3.计数器应用:视频播放数、电商浏览数每次都要加 1,并发大了对关系型数据库是挑战,Redis 天然支持计数且性能很好。
4.社交网络:赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新这类功能,访问量大,关系型数据库不太适合,Redis 的数据结构实现起来相对容易。
5.消息队列系统:发布订阅加阻塞队列,虽然不如专业消息队列强大,但一般的消息队列功能基本能满足。
不能做的场景,要站在两个角度判断:
1.数据规模:Redis 数据在内存里,如果数据量非常大(比如每天几亿的用户行为数据),用它来存基本是 "无底洞",经济成本很高。
2.数据冷热:热数据(频繁操作,比如视频基本信息)放 Redis 加速读写、减轻后端负载,是事半功倍;冷数据(比如用户观看记录)放进去就是对内存的浪费。
一句话:Redis 不是万金油,有它擅长的,也有它不擅长的。
四.版本选择:看第二位数字的奇偶
Redis 借鉴了 Linux 的版本命名规则:版本号第二位是奇数的为非稳定版本(如 2.7、2.9、3.1),偶数为稳定版本(如 2.6、2.8、3.0、3.2)。奇数版本其实是下一个稳定版本的开发版,比如 2.9 是 3.0 的开发版。所以生产环境一般选偶数版本,想尝新特性可以选最新的奇数版本。
章节里梳理了几个重要版本的核心演进,这里挑跟日常使用关系最密切的几条:
- Redis 2.6(2012):服务端支持 Lua 脚本,键过期支持毫秒级,去掉虚拟内存相关功能。
- Redis 2.8(2013):添加部分主从复制,降低网络问题导致频繁全量复制生成 RDB 的压力;Sentinel 第二版变为生产可用;config rewrite 可以把 config set 持久化到配置文件。
- Redis 3.0(2015):推出官方分布式实现 Redis Cluster;优化 LRU 算法。
- Redis 3.2(2016):加入 GEO 地理信息定位功能;新的 List 编码类型 quicklist。
- Redis 4.0(2017):提供模块系统,第三方可以扩展功能;PSYNC 2.0 优化了主从切换必然全量复制的问题;新增 LFU 淘汰算法(注意和 LRU 的区别:LRU 基于访问时间,LFU 基于访问次数);提供非阻塞删除,新增 unlink 命令把删除放到后台线程执行;提供 RDB-AOF 混合持久化。
- Redis 5.0(2018):新增 stream 流数据类型;redis-cli 的集群管理器从 Ruby 移植到了 C 语言。
- Redis 6.0(2020):多线程 IO(只处理网络读写和协议解析,命令执行仍单线程);客户端缓存 client-side-caching;开始支持 RESP 3 协议;连接支持 SSL;增强 ACL 权限控制,可对不同 key 授予不同操作权限。
五.安装与启动
我们以ubuntu安装为例
使用apt安装
apt install redis -y
装完有几个关键文件和目录要记住:
- 程序相关:/usr/bin/redis-server 是服务端程序,redis-check-aof、redis-check-rdb、redis-sentinel 都是它的软链接,分别用来修复 AOF 文件、修复 RDB 文件、跑哨兵;redis-cli 是命令行客户端;redis-benchmark 做性能基准测试;redis-shutdown 是停止专用脚本。
- 配置文件:/etc/redis.conf 是服务器配置,/etc/redis-sentinel.conf 是哨兵配置。
- 持久化文件默认在 /var/lib/redis/,日志在 /var/log/redis/(默认按天分割,到期用 gzip 压缩)。
启动、停止、重启,在 Ubuntu 里通常用:
service redis-server start
service redis-server stop
service redis-server restart
如果配置了 systemd 托管,更建议用 systemd 的方式管理启停。
远程连接需要改配置:编辑 /etc/redis/redis.conf,把 bind 127.0.0.1 改成 bind 0.0.0.0,把 protected-mode yes 改成 protected-mode no。要注意配置里那行注释的提醒 —— 如果机器直接暴露在公网,绑到所有接口是有风险、会被全网访问的,需要结合安全策略使用。
客户端连接有两种方式:
- 交互式:redis-cli -h 127.0.0.1 -p 6379 进入交互,之后直接敲命令。
- 命令式:redis-cli -h 127.0.0.1 -p 6379 get key,一条命令直接拿结果。
两个小点:本地默认 6379 端口时 -h、-p 可以省略;redis-cli 也是后面学 Redis 的主力工具,很多章节都会用它演示。
Redis客户端与服务端的交互过程示意图:

六.本章重点回顾
1. Redis 的8个特性:速度快、基于键值对的数据结果服务器、功能丰富、简单稳定、客⼾端语⾔ 多、持久化、主从复制、⽀持⾼可⽤和分布式。
2. Redis 并不是万⾦油,有些场景不适合使⽤Redis进⾏开发。
3. 开发运维结合以及阅读源码是⽤好Redis的重要⽅法。
4. 安装启动Redis。
5. 根据需求选择稳定版本的Redis。
网硕互联帮助中心



评论前必须登录!
注册