文章目录
- 1. Redis 简介
- 2. Redis 优缺点
- 3. Redis 高性能
- 4. Redis VM 机制
- 5. Redis 数据类型
- 6. 应用场景
- 7. 持久化
- 8. 过期策略
- 9. 内存相关
- 10. 线程模型
- 11. 事务
- 12. 集群
1. Redis 简介
定义
:Redis 是一个用 C 语言编写的高性能非关系型(NoSQL)键值对数据库。数据类型
:键的类型只能为字符串,值支持五种数据类型:字符串(String)、列表(List)、集合(Set)、散列表(Hash)、有序集合(Zset)。存储方式
:数据存在内存中,读写速度快。应用场景
:缓存、分布式锁、事务处理、持久化、LUA脚本执行、LRU驱动事件、多种集群方案。
2. Redis 优缺点
优点
:- 读写快:基于内存操作和底层线程模型。
- 数据持久化:支持 AOF 和 RDB 持久化机制。
- 事务支持:Redis 操作是原子性的,支持合并后的原子性执行。
- 丰富的数据结构:除了字符串外还支持 hash、set、zset、list 等。
- 主从复制:主机会自动将数据同步到从机,可以实现读写分离。
- 多种集群模式。
缺点
:- 容量限制:数据库容量受物理内存限制。
- 主从复制局限:不具备自动容错和恢复功能,主机宕机可能导致数据不一致问题。
常见问题
:- 缓存击穿 -> 热点key过期,高并发请求打到数据库 -> 设置合理的缓存失效时间
- 缓存穿透 -> 访问不存在的key,恶意攻击数据库 -> 针对接口限流、针对用户限流、使用布隆过滤器(Bloom Filter)防止穿透
- 缓存雪崩 -> 大量key集中失效,大量请求打到数据库 -> 数据预热、分布式部署缓存服务器
3. Redis 高性能
- 基于内存操作,类似 HashMap 的查找效率。
- 数据结构简单,专为高效操作设计。
- 单线程模型,避免上下文切换和竞争条件。
- 使用多路 I/O 复用模型,非阻塞 IO。
- 自构建 VM 机制,优化内存使用。
4. Redis VM 机制
- 开启 VM 功能可实现冷热数据分离,提高访问速度。
- 自行管理交换文件,减少IO操作,提高效率。
5. Redis 数据类型
String
:支持字符串、整数或浮点数的操作。- SDS 柔性数组对象(不限长度的char[]),记录了已用字符串len,未用字符串free,不需要读结尾 \0
List
:双向链表,支持两端压入弹出元素。- quickList、zipList(数组)/listPack(链表)
Set
:无序集合,支持交集、并集等操作。- intset(value 为整数类型,元素少于 set-max-intset-entries 配置值时使用此结构) / dict
Zset
:有序集合,支持排序操作。- skipList(跳表)
Hash
:包含键值对的无序散列表。- listPack / dict -> Hashtable 扩容和渐进式 Rehash (在rehash过程中,同时使用原哈希表和新哈希表来进行键值对的查找和插入操作, 实现平滑的哈希表扩容,保证并发访问,避免 rehash 过程出现大量的哈希冲突)
6. 应用场景
计数器
:利用 String 类型进行自增自减操作。缓存
:热点数据缓存,提高读取速度。会话缓存
:统一存储多台服务器会话信息。全页缓存 (FPC)
:用于快速加载浏览过的页面。查找表
:如 DNS 记录。消息队列
:使用 List 实现简单的消息队列。分布式锁
:使用 SETNX 命令实现。- 其他应用:如排行榜、共同好友等功能。
7. 持久化
RDB
:定期快照保存,性能高但安全性较低。(BGSAVE)AOF
:记录每次写命令,数据安全但文件较大。
总结:通常同时使用两种机制,优先加载 AOF 文件恢复数据。
8. 过期策略
- 定时过期:立即清除过期数据,占用 CPU 资源。
- 惰性过期:访问时检查是否过期,节省 CPU 资源。
- 定期过期:定期扫描并清除 expires 字典中一定数量的过期数据,平衡 CPU 和内存资源。
9. 内存相关
淘汰策略
:筛选范围分为全局的和设置过期时间的键空间选择性移除;常用算法有:当内存不足时移除最近最少使用的 key (LRU 算法)或随机移除 key (Random 算法),还有 LFU 算法和 TTL 算法。内存优化
:使用集合类型(hash,set,zset,list)数据存储,减少内存占用。
10. 线程模型
单 Reactor 多线程模型
:基于 Reactor 模式实现了核心组件 - 文件事件处理器:使用 I/O 多路复用监听多个套接字, 并发送产生事件的套接字给文件事件分派器(单线程),分派器根据套接字执行的任务类型调用不同的事件处理器。事件循环(Event Loop)
:基于事件驱动的异步非阻塞的网络通信模型,它通过监听和处理事件来实现网络通信和其他任务的处理, I/O 多路复用 是事件循环机制用于检测文件描述符活动状态的一种技术实现。
11. 事务
概念
:通过 MULTI、EXEC、WATCH 等命令实现,保证一次性、顺序性、排他性地执行一系列命令。特性
:支持原子性和隔离性,但不支持回滚。Lua 脚本
:保证脚本内命令的一次性执行,同样不提供回滚。
12. 集群
主从复制
- 读写分离
-
- 全量复制 - RDB;
-
- 基于长连接的命令传播;
-
- 增量复制 - repl_backlog_buffer环形缓冲区 + master_repl_offset / slave_repl_offset
Sentinel 哨兵模式
- 实时监控 & 故障转移 (定期PING -> 主观下线 -> 客观下线 -> 故障转移,注意不是领导者下线而是主节点下线)
- Sentinel 领导者选举 - Raft 一致性算法(候选者状态 -> 提名和投票 -> 选举过程[等待赞成票] -> 防止分裂 -> 领导者维持)
Cluster 模式
- 三种分片方案(客户端分片、代理层分片以及 Redis Cluster - 解决横向扩展问题)
- Redis Cluster 方案:一致性哈希 分片,Gossip 协议 信息交换
- 节点通信与故障检测
- 主从复制
- 数据迁移
- 客户端路由