Featured image of post Redis介绍

Redis介绍

Redis基础介绍

Redis介绍

一、核心设计思想

  1. 内存优先
    • 所有数据存储在内存中,读写性能极高(可达10万+ QPS)。
    • 通过持久化机制将数据异步保存到磁盘,保证数据可靠性。
  2. 单线程模型(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协议通信。
  • 故障检测与转移:主节点故障时,从节点自动接替。

五、性能关键点

  1. 纯内存操作:避免磁盘I/O瓶颈。
  2. 单线程模型:避免上下文切换和锁竞争。
  3. 高效数据结构:针对场景优化存储和访问。
  4. I/O多路复用:单线程处理大量并发连接。
  5. 管道(Pipeline):批量发送命令,减少网络往返时间。

六、典型应用场景

  • 缓存:加速热点数据访问,支持过期策略。
  • 会话存储:存储用户会话信息。
  • 排行榜:使用Sorted Set实现实时排名。
  • 消息队列:使用List/Stream实现轻量队列。
  • 分布式锁:通过SETNX命令实现。

七、注意事项

  • 内存限制:数据量受物理内存限制,需监控内存使用。
  • 持久化权衡:根据对数据安全性的要求选择RDB/AOF策略。
  • 集群管理:Redis Cluster需客户端支持重定向,运维复杂度较高。
  • 缓存穿透/雪崩:需结合布隆过滤器、过期时间分散等策略防护。

总结

Redis通过内存存储+高效数据结构+异步持久化的设计,在性能与功能间取得平衡。其单线程模型简化了并发控制,而集群方案提供了横向扩展能力。理解其原理有助于根据业务场景合理选择数据结构、持久化策略和集群架构。

Licensed under CC BY-NC-SA 4.0
最后更新于 Mar 14, 2022 15:23 UTC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计