Redis核心知识点简介,快速记忆
目录标题
- 1. 持久化
- RDB (快照)
- AOF (Append Only File)
- 2. Redis数据结构
- String
- List
- Hash
- Set
- Zset
- 3. 内存管理
- 4. 缓存三大问题
- 缓存穿透
- 缓存击穿
- 缓存雪崩
- 5. 集群
- 6. 应用
- 7. 事务
- 8. 总结
1. 持久化
RDB (快照)
什么是RDB?
RDB 是 Redis 的一种持久化方式,它会在指定的时间间隔内创建数据集的快照。RDB 文件是一个紧凑的二进制文件,包含在某一时间点上的所有数据。
RDB的优点和劣势?
优点:
- 快速恢复:因为 RDB 文件是一个完整的数据集,所以 Redis 在重启时可以直接从 RDB 文件中恢复数据,速度快。
- 小巧的文件大小:RDB 文件通常比 AOF 文件小,更容易备份和传输。
劣势:
- 数据丢失的风险:如果 Redis 在两次快照之间崩溃,那么这段时间内的数据将会丢失。
- CPU 和 I/O 开销:生成 RDB 文件时会对 CPU 和 I/O 造成一定负担。
RDB触发机制?
RDB 可以通过以下两种方式触发:
- 手动触发:使用
SAVE
或BGSAVE
命令。 - 自动触发:通过配置
save
参数,在满足条件时自动触发。
AOF (Append Only File)
什么是AOF?
AOF 是另一种持久化方式,它会记录所有写入 Redis 的命令,并将它们追加到一个文件中。AOF 文件可以用于恢复数据。
AOF的优点和劣势?
优点:
- 数据安全:即使 Redis 在运行过程中崩溃,也可以通过回放 AOF 文件来恢复数据。
- 可定制性:可以通过配置
appendfsync
参数来调整 AOF 的同步频率。
劣势:
- 较大的文件尺寸:AOF 文件通常比 RDB 文件大,因为它记录了所有命令。
- 较长的恢复时间:由于需要逐条执行命令,AOF 的恢复过程可能比 RDB 更慢。
AOF触发机制?
AOF 通过以下方式触发:
- 手动触发:使用
bgrewriteaof
命令。 - 自动触发:通过配置
appendfsync
参数来控制何时同步 AOF 文件。
2. Redis数据结构
String
使用整数值实现
Redis 中的字符串类型可以存储任意长度的文本数据,包括二进制数据。它可以用于计数器、缓存等场景。在存储和获取二进制数据时,确保正确处理编码和解码。
使用embstr编码的动态字符串实现
embstr 是一种特殊的数据结构,用于存储小于等于 44 字节的小字符串。这种结构减少了内存开销,提高了效率。
为什么 Redis 字符串可以存储二进制数据?
-
字节数组的实现:
- Redis 的字符串类型内部使用了一个字节数组来存储数据。字节数组可以存储任意的字节序列,而不仅仅是可打印的字符。
- 在 C 语言中,字节数组通常是一个
unsigned char
类型的数组,可以表示 0 到 255 之间的任何值,这正是二进制数据的范围。
-
无特殊字符限制:
- 传统字符串(如 C 语言中的
char *
)通常以\0
(空字符)作为终止符。这限制了字符串中不能包含\0
。然而,Redis 的字符串类型没有这样的限制,它可以包含任何字节,包括\0
。
- 传统字符串(如 C 语言中的
-
灵活性:
- 由于 Redis 的字符串类型可以存储任意字节序列,因此它可以用于多种用途,包括存储文本数据、二进制数据、序列化对象等。
List
压缩列表实现
Redis 的列表类型使用了一种称为 “压缩列表” 的数据结构。这种结构允许高效地添加、删除元素,并且支持快速访问特定位置的元素。
双端列表实现
除了普通的单链表外,Redis 还提供了双端链表的支持,使得插入和删除操作更加灵活。
Hash
字典实现
Redis 的哈希类型使用了一个键值对的映射关系。内部实现了高效的查找、插入和删除操作。
Set
整数集合实现
Redis 的集合类型可以存储唯一的成员。对于整数类型的集合,Redis 提供了一些优化措施以提高性能。
字典实现
对于非整数类型的集合,Redis 同样使用了字典结构来进行存储和管理。
Zset
跳跃表实现
有序集合(Sorted Set)使用了跳表作为底层数据结构。这使得 Redis 能够高效地处理排序和范围查询操作。
3. 内存管理
淘汰策略
Redis 提供了多种内存淘汰策略,以便在内存不足的情况下决定哪些键应该被移除。常见的策略包括 noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random 和 volatile-ttl。
LRU算法
LRU(Least Recently Used)是最近最少使用的算法。Redis 使用该算法来确定哪个键是最长时间没有被访问过的,从而优先将其移除。
LFU算法
LFU(Least Frequently Used)是最少频繁使用的算法。Redis 使用该算法来确定哪个键的访问频率最低,从而优先将其移除。
删除策略
- 定时删除
- 惰性删除
- 定期删除
4. 缓存三大问题
缓存穿透
定义
缓存穿透是指查询一个不存在的 key,导致每次都去查数据库的情况。
解决方案
- 布隆过滤器:预先判断 key 是否存在,避免无效查询。
- 缓存空对象:将查询结果为空的对象也缓存起来,减少数据库压力。
缓存击穿
定义
缓存击穿是指热点 key 失效后,大量并发请求同时访问数据库的现象。
解决方案
- 加锁:使用分布式锁控制并发访问。
- 互斥锁:利用 Redis 的 SETNX 命令实现简单的互斥锁功能。
缓存雪崩
定义
缓存雪崩是指多个 key 在同一时间段内失效,导致大量请求涌入数据库的情况。
解决方案
- 设置不同的过期时间:使 key 的过期时间错开,避免集中失效。
- 分布式集群:通过多台机器分担负载,降低单个节点的压力。
5. 集群
哈希算法
Redis 集群使用了一致性哈希算法来分配 slot 给各个节点。每个 slot 代表一部分 key 空间,确保数据均匀分布。
节点通信
Redis 集群中的节点之间通过 Gossip 协议进行心跳检测和状态信息交换,保证集群的健壮性和可用性。
客户端请求数据
客户端发送请求时,首先通过哈希函数计算出对应的 slot,然后找到负责该 slot 的节点进行数据交互。
主从复制
Redis 集群支持主从复制模式,其中主节点负责接收写入请求,而从节点负责同步数据副本。这样既提升了系统的可扩展性,又增强了容灾能力。
6. 应用
秒杀
Redis 可以用于实现高性能的秒杀系统。通过使用原子操作如 INCRBY、DECRBY 等,可以有效地防止超卖现象的发生。
订阅与发布
Redis 内置了 Pub/Sub 功能,允许多个客户端订阅同一个频道,并接收其他客户端发布的消息。这对于构建实时通知系统非常有用。
消息队列
Redis 还可以作为一个轻量级的消息队列中间件。通过使用 LIST 数据结构,可以实现先进先出(FIFO)的消息传递模型。
7. 事务
监控(WATCH key)
在执行事务前,可以使用 WATCH 命令监视某些 key 的变化情况。如果这些 key 在事务执行期间发生了变化,则整个事务会被取消。
取消监控(UNWATCH)
UNWATCH 命令用于清除当前客户端的监视状态,使其不再受任何 key 的影响。
开始事务(MULTI)
MULTI 命令标志着一个新的事务块的开始。在此之后的所有命令都不会立即执行,而是被收集起来等待 EXEC 命令的调用。
放弃事务(DISCARD)
DISCARD 命令用于放弃当前事务块内的所有命令,相当于清空事务队列。
执行事务(EXEC)
EXEC 命令用于提交事务,执行之前收集的所有命令,并返回它们的结果。