3Redis 介绍 · SpringCloud微服务实战 · 看云
导航
本书不是主要讲解Redis 的,因此主要介绍一些特性和主要功能,想了解更多的话可以阅读Redis 开发与运维这本书
1. Redis 简介
Redis 是一种基于键值对(key-value) 的NoSQL数据库并且是完全免费的,Redis 可以存储的值由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmap(位图)、HyperLogLog、GEO(地理位置信息)等多种数据结构和算法组成。因此Redis 可以满足很多应用场景,并且Redis 可以存储在内存中,因此它的读写速度非常惊人。不仅如此,Redis 还可以将内存中的数据利用快照、日志的形式保存到硬盘中,这样即使发生机器故障数据也不会丢失。Redis 还提供了键过期、发布订阅、事务、流水线、Lua脚本等功能。这也是为什么Redis 如此流行的原因。
2. Redis 特性
- 速度快
-
- Redis的所有数据都是存放在内存中
-
- Redis是用C语言实现的
-
- Redis使用了单线程架构,预防了多线程可能产生的竞争问题
- 基于键值对的数据结构服务器
- 丰富的功能(键过期、发布订阅实现消息系统)
- 简单稳定
- 客户端语言多(支持Redis的客户端语言非常多,Java、PHP、Python、C、C++、Nodejs等)
- 持久化 (Redis 提供了两种持久化方式:RDB 和 AOF)
- 主从复制
- 高可用和分布式
3. Redis 的持久化方式
Redis 支持RDB、AOF两种持久化机制,持久化功能有效的避免因进程退出造成的数据丢失问题,当下次重启的时候利用之前持久化的文件即可恢复数据。
运维还要经常对持久化的数据进行备份(例如备份到云服务器)
3.1 RDB
RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
手动触发分别对应save、bgsave命令,因bgsave 对 save 阻塞问题做了优化,因此现在已经废弃了save命令。
自动触发情况如下:
- 执行
sava m n表示m秒内数据及n次修改即会自动触发 - 从阶段执行全量复制的时候,主节点会自动生成RDB文件并发送给从节点
- 执行
debug reload中心加载redis时会自动触发 - 默认情况下执行
shutdown时,前提是没有开启AOF的配置
3.2 RDB 工作流程
- 执行bgsave 命令的时候,父进程会判断当前是否存在正在执行的子进程,如RDB、AOF子进程,如果存在bgsave命令直接返回
- 父进程执行fork操作创建子进程,fork操作过程中会造成父进程阻塞
- 父进程fork完之后,bgsave命令返回
Background saving started并不在阻塞父进程,继续响应其他命令 - 子进程创建RDB文件,根据父进程内容生成临时的快照文件,完成后对原有的文件进行原子替换
- 进程发送信号给父进程表示完成,父进程更新统计信息
3.3 AOF
AOF 是以独立日志的方式记录每次写命令,重启时再重新实行AOF文件的命令达到恢复数据的目的。
AOF 默认是不开启的,开启的话需要设置appendonly tes,默认文件名appendonly.aof
3.4 AOF工作流程
- 所有的写入命令会追加到aof_buff(缓冲区)中
- AOF缓冲区会根据对应的策略向硬盘做同步操作
- 随着AOF文件越来越大,需要定期对AOF文件做重写
- 当Redis 重启的时候,可以加载AOF文件进行重写
3.5 数据恢复
AOF 和RDB 都可以进行数据恢复,下图表示Redis 持久化的加载过程
4. Redis 其它相关介绍
Redis 是典型的单线程结构,所有的操作都在一条主线程中完成。当Redis 用于高并发场景的时候这条线就是它的生命线,如果出现阻塞那将是应用的噩梦,因此合理使用Redis 将会很重要。
导致阻塞的主要原因如下
- 不合理的使用API和数据结构
- CPU饱和
- 持久化阻塞
- CPU竞争
- 内存交换
- 网络问题等
5. Redis 高可用
Redis 除了可以单机部署,还提供了Sentinel 和Cluster 模式,这些对提高整个系统的高可用性是非常有帮助的。
6. 补充
6.1 RESP协议
Redis服务器与客户端通过RESP(REdis Serialization Protocol)协议通信
RESP有五种最小的单元类型,单元结束时统一加上回车换行符号\r\n。
单行字符串 以 + 符号开头。
多行字符串 以 $ 符号开头,后跟字符串长度。
整数值 以 : 符号开头,后跟整数的字符串形式。
错误消息 以 - 符号开头。
数组 以 * 号开头,后跟数组的长度。
RESP协议特点
- 实现简单
- 快速解析
- 可阅读
6.2 Gossip协议
RedisCluster集群间的通信协议
Gossip协议基本思想就是 :一个节点想要分享一些信息给网络中的其他的一些节点。于是,它周期性的随机选择一些节点,并把信息传递给这些节点。这些收到信息的节点接下来会做同样的事情,即把这些信息传递给其他一些随机选择的节点。一般而言,信息会周期性的传递给N个目标节点,而不只是一个
在RedisCluster 使用如下(包含ping、pong、meet、fail):
- meet:某个节点发送meet给新加入的节点,让新节点加入到集群中,然后新节点会与其他节点进行通讯
- ping:每个节点都会频繁的向其他节点发送ping,其中包含自己的状态和自己维护的集群元数据,互相通过ping交换 元数据
- pong:返回ping和meet,包含自己的状态和其他信息,也可以用于信息的广播和更新
- fail:某个节点判定另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了


