📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、核心数据结构
Redis的核心数据结构设计旨在提供高性能和灵活的数据存储与检索能力。以下是对Redis核心数据结构的深入解析:
1. 特殊结构
(1) HyperLogLog(基数统计)
HyperLogLog是一种基于概率的算法,用于估计集合中不同元素的数量。它通过使用多个独立的哈希函数和一个计数器来估算基数。在实现上,Redis为每个HyperLogLog数据结构维护一个哈希表,该表包含一个或多个哈希函数的输出值。当插入新元素时,Redis将元素哈希,并根据哈希值更新计数器。这种结构在内存占用和计算效率之间提供了良好的平衡。
(2) Bitmap(位图操作)
Bitmap是一种使用单个位来表示数据集合的数据结构。在Redis中,位图可以用于表示布尔值或计数,例如用户活跃状态。位图操作包括设置位、获取位和计数操作。位图的优势在于其极高的空间效率,因为它只需要一个位来表示一个元素的状态。
(3) GEO(地理空间索引)
GEO数据结构允许Redis存储地理位置信息,并支持基于地理坐标的查询。在实现上,GEO使用空间索引来存储位置信息,并提供了查询附近元素、计算两点之间的距离等功能。这种结构在实现上依赖于空间几何算法,如球面三角学。
2. 底层实现
(1) 跳跃表(Sorted Set实现)
跳跃表是一种数据结构,它通过多级索引来提高搜索效率。在Redis中,跳跃表用于实现Sorted Set,允许根据元素的分数进行排序和查询。跳跃表的实现涉及到多个层级的索引,每个层级都包含指向下一层的指针,从而实现快速跳跃。
(2) 压缩列表(List/Hash优化存储)
压缩列表是Redis中用于存储小数据量的列表和哈希表的数据结构。它通过将多个小元素紧凑地存储在一起来减少内存占用。压缩列表在内存占用和性能之间提供了平衡,适用于存储少量数据的情况。
(3) 快速列表(QuickList)
快速列表结合了链表和数组的优点,用于优化Redis中的列表数据结构。在实现上,快速列表使用多个压缩列表和数组来模拟链表的行为,从而在保持链表插入和删除操作的高效性的同时,提供数组的快速访问能力。
二、持久化机制
1. RDB
RDB是一种基于快照的持久化机制,它定期将Redis的数据快照保存到磁盘。在Redis重启时,可以从RDB文件中恢复数据。RDB的触发条件包括手动触发、定时触发和自动触发。在实现上,RDB通过执行SAVE
或BGSAVE
命令来触发数据快照的创建。
2. COW(写时复制)机制
COW是一种内存管理策略,它通过创建数据的副本来避免直接修改原始数据。在Redis中,当执行写操作时,系统会创建一个新数据副本,并将写操作应用于这个副本,从而保持原始数据不变。这种机制在实现上涉及到内存分配和复制操作。
3. AOF
AOF(Append Only File)是一种基于日志的持久化机制,它记录了Redis的所有写操作。在Redis重启时,可以从AOF文件中恢复数据。AOF的重写压缩流程包括合并日志文件、压缩日志文件和重写AOF文件。在实现上,AOF使用文件系统来记录操作,并提供了多种配置选项来控制同步频率。
4. fsync策略
fsync策略用于控制AOF文件的同步频率。Redis提供了三种fsync策略:always、everysec和no。always策略表示每次写操作都同步到磁盘,everysec策略表示每秒同步一次,no策略由操作系统决定同步频率。在实现上,fsync策略涉及到文件系统的同步操作。
三、高可用方案
1. 哨兵模式
哨兵模式通过多个哨兵节点监控主从节点,实现故障转移和自动修复。在实现上,哨兵节点通过定期发送心跳信号来监控主从节点的状态,并在主节点故障时进行故障转移。
2. 领导者选举流程
在哨兵模式下,当主节点故障时,哨兵节点会进行领导者选举以确定新的主节点。选举流程包括哨兵节点收集信息、哨兵节点投票和选举领导者。在实现上,领导者选举依赖于Raft或Paxos等共识算法。
3. 集群模式
集群模式是一种分布式存储方案,它将多个Redis节点组成一个集群。在实现上,集群使用哈希槽分配算法来均匀分配数据到不同的节点,并提供了ASK/MOVED重定向机制来处理数据迁移。
四、高级特性
1. 内存管理
(1) LRU/LFU淘汰策略
LRU(最近最少使用)和LFU(最少使用频率)是Redis的内存淘汰策略。在实现上,Redis使用一个定时器来周期性地检查内存使用情况,并根据LRU/LFU策略淘汰部分数据。
(2) 内存碎片整理
内存碎片整理是指对内存进行整理,释放无效内存,提高内存利用率。在Redis中,内存碎片整理通常在内存重新分配时进行。
(3) 惰性删除机制
惰性删除机制是指当数据过期时,Redis不会立即删除数据,而是等待下一次访问时再进行删除。在实现上,Redis使用定时器来跟踪过期数据,并在数据访问时进行删除。
2. 事务控制
(1) WATCH/MULTI/EXEC
WATCH/MULTI/EXEC是Redis的事务控制命令。WATCH命令用于监控数据变化,MULTI命令用于开启事务,EXEC命令用于执行事务。在实现上,Redis使用乐观锁来保证事务的原子性。
(2) 悲观锁实现
悲观锁是一种锁机制,用于保证数据的一致性。在Redis中,可以通过SETNX命令实现悲观锁。在实现上,SETNX命令尝试设置一个键的值,如果键不存在,则设置成功,否则失败。
(3) Lua脚本原子性
Lua脚本是一种嵌入式脚本语言,可以用于实现Redis的原子操作。在实现上,Redis将Lua脚本作为一个整体执行,确保脚本中的所有操作要么全部成功,要么全部失败。
五、扩展组件
1. Redis模块
Redis模块是一种扩展Redis功能的机制,可以用于实现自定义数据结构、命令和功能。在实现上,Redis模块通过C语言编写,并与Redis服务器进行交互。
2. 生态工具
(1) RedisInsight(可视化监控)
RedisInsight是一种可视化监控工具,可以用于监控Redis的性能和状态。在实现上,RedisInsight使用Web界面和Redis的命令行工具来收集和展示数据。
(2) RedisBloom(布隆过滤器)
RedisBloom是一种布隆过滤器,可以用于快速判断一个元素是否存在于集合中。在实现上,RedisBloom使用位图和哈希函数来构建布隆过滤器。
(3) twemproxy(分片代理)
twemproxy是一种分片代理,可以将请求分发到不同的Redis节点。在实现上,twemproxy使用哈希算法来决定请求应该被发送到哪个节点。
六、性能优化
1. 客户端
(1) Pipeline批处理
Pipeline批处理可以将多个命令打包成一个请求发送到Redis,从而提高命令执行效率。在实现上,客户端维护一个缓冲区,将多个命令写入缓冲区,然后一次性发送到Redis。
(2) 连接池配置
连接池配置可以优化客户端与Redis的连接,提高数据传输效率。在实现上,连接池管理多个连接,并在需要时重用这些连接。
(3) 读写分离策略
读写分离策略可以将读操作和写操作分配到不同的Redis节点,从而提高系统性能。在实现上,可以通过配置Redis集群或使用读写分离代理来实现。
2. 服务端
(1) 多IO线程
多IO线程可以提高Redis的并发处理能力。在实现上,Redis使用多线程来处理客户端请求,每个线程负责处理一部分请求。
(2) 后台线程优化
后台线程优化可以减少Redis的CPU占用,提高系统性能。在实现上,Redis使用后台线程来处理非客户端请求的任务,如持久化、内存淘汰等。
(3) 大key拆分方案
大key拆分方案可以将大key拆分成多个小key,从而提高Redis的存储和查询效率。在实现上,可以通过编程方式将大key分解为多个小key,并在需要时重新组合。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~