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命令。
自动触发情况如下:

  1. 执行sava m n 表示m秒内数据及n次修改即会自动触发
  2. 从阶段执行全量复制的时候,主节点会自动生成RDB文件并发送给从节点
  3. 执行debug reload 中心加载redis时会自动触发
  4. 默认情况下执行shutdown时,前提是没有开启AOF的配置

3.2 RDB 工作流程

9cb86eef7fe30f5a0dbef9e10c8572b6_MD5.webp

  1. 执行bgsave 命令的时候,父进程会判断当前是否存在正在执行的子进程,如RDB、AOF子进程,如果存在bgsave命令直接返回
  2. 父进程执行fork操作创建子进程,fork操作过程中会造成父进程阻塞
  3. 父进程fork完之后,bgsave命令返回Background saving started并不在阻塞父进程,继续响应其他命令
  4. 子进程创建RDB文件,根据父进程内容生成临时的快照文件,完成后对原有的文件进行原子替换
  5. 进程发送信号给父进程表示完成,父进程更新统计信息

3.3 AOF

AOF 是以独立日志的方式记录每次写命令,重启时再重新实行AOF文件的命令达到恢复数据的目的。
AOF 默认是不开启的,开启的话需要设置appendonly tes,默认文件名appendonly.aof

3.4 AOF工作流程

ac99deb63b70aa2c6a63864e1bec629d_MD5.webp

  1. 所有的写入命令会追加到aof_buff(缓冲区)中
  2. AOF缓冲区会根据对应的策略向硬盘做同步操作
  3. 随着AOF文件越来越大,需要定期对AOF文件做重写
  4. 当Redis 重启的时候,可以加载AOF文件进行重写

3.5 数据恢复

AOF 和RDB 都可以进行数据恢复,下图表示Redis 持久化的加载过程
facc65c7defca7de977dc72ce284a623_MD5.png

4. Redis 其它相关介绍

Redis 是典型的单线程结构,所有的操作都在一条主线程中完成。当Redis 用于高并发场景的时候这条线就是它的生命线,如果出现阻塞那将是应用的噩梦,因此合理使用Redis 将会很重要。
导致阻塞的主要原因如下

  1. 不合理的使用API和数据结构
  2. CPU饱和
  3. 持久化阻塞
  4. CPU竞争
  5. 内存交换
  6. 网络问题等

5. Redis 高可用

Redis 除了可以单机部署,还提供了Sentinel 和Cluster 模式,这些对提高整个系统的高可用性是非常有帮助的。

6. 补充

6.1 RESP协议

Redis服务器与客户端通过RESP(REdis Serialization Protocol)协议通信
RESP有五种最小的单元类型,单元结束时统一加上回车换行符号\r\n。

单行字符串 以 + 符号开头。
多行字符串 以 $ 符号开头,后跟字符串长度。
整数值 以 : 符号开头,后跟整数的字符串形式。
错误消息 以 - 符号开头。
数组 以 * 号开头,后跟数组的长度。

RESP协议特点

  1. 实现简单
  2. 快速解析
  3. 可阅读

6.2 Gossip协议

RedisCluster集群间的通信协议
Gossip协议基本思想就是 :一个节点想要分享一些信息给网络中的其他的一些节点。于是,它周期性的随机选择一些节点,并把信息传递给这些节点。这些收到信息的节点接下来会做同样的事情,即把这些信息传递给其他一些随机选择的节点。一般而言,信息会周期性的传递给N个目标节点,而不只是一个

在RedisCluster 使用如下(包含ping、pong、meet、fail):

  • meet:某个节点发送meet给新加入的节点,让新节点加入到集群中,然后新节点会与其他节点进行通讯
  • ping:每个节点都会频繁的向其他节点发送ping,其中包含自己的状态和自己维护的集群元数据,互相通过ping交换 元数据
  • pong:返回ping和meet,包含自己的状态和其他信息,也可以用于信息的广播和更新
  • fail:某个节点判定另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了