Redis介绍
一、核心设计思想
- 内存优先
- 所有数据存储在内存中,读写性能极高(可达10万+ QPS)。
- 通过持久化机制将数据异步保存到磁盘,保证数据可靠性。
- 单线程模型(Redis 6.0前核心逻辑)
- 使用单线程处理命令,避免多线程竞争和锁开销。
- 基于非阻塞I/O多路复用(epoll/kqueue)处理高并发连接。
- 6.0+版本引入多线程处理网络I/O,但核心命令执行仍为单线程。
二、数据存储原理
1. 键值存储结构
- 所有数据以**字典(哈希表)**形式组织,键为字符串,值支持多种数据结构。
- 全局哈希表保存所有键的指针,通过哈希函数快速定位(O(1)时间复杂度)。
2. 高效数据结构
Redis的值不仅支持简单字符串,还提供以下高级结构:
- String:动态字符串(SDS),可存储文本、数字或二进制数据。
- List:双向链表或压缩列表(ziplist),支持队列/栈操作。
- Hash:类似字典结构,存储字段-值映射。
- Set:无序集合,基于哈希表实现。
- Sorted Set:有序集合,使用跳表(skiplist) + 哈希表实现范围查询。
- HyperLogLog:概率数据结构,用于基数统计。
- Stream:日志流,支持消息队列场景。
3. 内存优化机制
- 渐进式Rehash:扩容时逐步迁移数据,避免长时间阻塞。
- 压缩存储:小数据使用ziplist/intset等紧凑结构,减少内存占用。
- 过期键清理:定期删除+惰性删除结合。
三、持久化原理
Redis提供两种持久化方式:
1. RDB(快照)
- 定时将内存数据全量保存为二进制文件(
.rdb)。 - 使用COW(Copy-On-Write) 技术:fork子进程写盘,父进程继续服务。
- 优点:文件紧凑,恢复速度快;缺点:可能丢失最后一次快照后的数据。
2. AOF(追加日志)
- 记录所有写操作命令到日志文件,重启时重放命令恢复数据。
- 支持配置同步策略:
appendfsync always:每次写都同步,数据最安全但性能低。appendfsync everysec:每秒同步(默认)。appendfsync no:由操作系统决定。
- AOF重写:定期压缩日志,去除冗余命令。
3. 混合持久化(Redis 4.0+)
- 结合RDB和AOF,先写RDB快照,再追加增量AOF日志,兼顾恢复速度和数据安全。
四、高可用与集群
1. 主从复制
- 主节点异步复制数据到从节点,支持读写分离和故障转移。
- 全量复制(首次同步)使用RDB + 缓冲命令流;增量复制通过复制偏移量实现。
2. 哨兵(Sentinel)
- 监控主节点状态,自动故障转移和切换。
- 通过投票机制避免脑裂问题。
3. 集群模式(Redis Cluster)
- 数据分片:采用哈希槽(hash slot,共16384个槽)分散数据到多个节点。
- 去中心化架构:每个节点保存集群状态信息,通过Gossip协议通信。
- 故障检测与转移:主节点故障时,从节点自动接替。
五、性能关键点
- 纯内存操作:避免磁盘I/O瓶颈。
- 单线程模型:避免上下文切换和锁竞争。
- 高效数据结构:针对场景优化存储和访问。
- I/O多路复用:单线程处理大量并发连接。
- 管道(Pipeline):批量发送命令,减少网络往返时间。
六、典型应用场景
- 缓存:加速热点数据访问,支持过期策略。
- 会话存储:存储用户会话信息。
- 排行榜:使用Sorted Set实现实时排名。
- 消息队列:使用List/Stream实现轻量队列。
- 分布式锁:通过
SETNX命令实现。
七、注意事项
- 内存限制:数据量受物理内存限制,需监控内存使用。
- 持久化权衡:根据对数据安全性的要求选择RDB/AOF策略。
- 集群管理:Redis Cluster需客户端支持重定向,运维复杂度较高。
- 缓存穿透/雪崩:需结合布隆过滤器、过期时间分散等策略防护。
总结
Redis通过内存存储+高效数据结构+异步持久化的设计,在性能与功能间取得平衡。其单线程模型简化了并发控制,而集群方案提供了横向扩展能力。理解其原理有助于根据业务场景合理选择数据结构、持久化策略和集群架构。