前言在现代互联网系统中无论是电商秒杀、社交平台、在线教育还是金融系统几乎都离不开 Redis。很多开发者认为 Redis 只是一个 Key-Value 缓存工具但实际上 Redis 已经发展成为高性能缓存数据库分布式锁实现方案消息队列中间件排行榜系统实时统计系统地理位置服务流处理平台甚至在很多互联网公司中MySQL负责存储数据Redis负责承载流量因此掌握 Redis 已经成为 Java 后端工程师、架构师必备技能之一。本文将从 Redis 的底层原理、数据结构、缓存设计、高并发场景、分布式锁、持久化、集群架构等多个角度进行全面剖析。一、Redis简介1.1 什么是RedisRedisRemote Dictionary Server是一个基于内存的高性能 Key-Value 数据库其特点开源支持持久化支持事务支持发布订阅支持Lua脚本支持集群部署官网https://redis.io1.2 Redis为什么快很多面试官喜欢问Redis为什么快原因主要有以下几点1、基于内存操作MySQLselect*fromuserwhereid1需要磁盘 - 内存 - CPURedis内存 - CPU速度差距磁盘 10ms左右 内存 100ns左右差距超过100000倍2、单线程模型Redis核心命令执行单线程很多人认为单线程一定慢其实这是误区。Redis瓶颈网络IO 内存读写不是CPU计算。单线程避免锁竞争 线程切换 上下文切换反而效率更高。3、IO多路复用Redis采用epoll select kqueue实现一个线程管理多个连接流程客户端A 客户端B 客户端C ↓ epoll监听 ↓ Redis主线程因此可支撑10W 并发连接二、Redis数据类型详解Redis面试最常考内容之一。2.1 String最常用类型。存储结构key - value例如set name zhangsan获取get name结果zhangsan应用场景缓存用户信息set user:1001 {id:1001,name:Tom}计数器incr article:view:1统计阅读量 点赞量 收藏量2.2 Hash类似Java中的Map。存储结构key field - value例如hset user:1 name Tom hset user:1 age 18查询hget user:1 name优势相比String节省内存 方便更新部分字段2.3 List双向链表结构。添加数据lpush list 1 lpush list 2 lpush list 3结果3 2 1应用场景消息队列生产者lpush queue order消费者rpop queue2.4 Set无序且唯一。sadd user 1 sadd user 2 sadd user 3重复元素sadd user 3不会存储。应用场景用户标签sadd vip_users 1001 sadd vip_users 1002共同好友sinter friendA friendB2.5 Sorted SetZSetRedis最经典的数据结构。内部Hash SkipList(跳表)添加zadd rank 100 Tom zadd rank 90 Jack zadd rank 95 Rose查询排行榜zrevrange rank 0 9应用场景游戏排行榜玩家 分数 Tom 100 Rose 95 Jack 90热搜榜微博热搜 抖音热榜 知乎热榜三、Redis底层数据结构很多人只知道String Hash List但面试官问String底层是什么很多人就不会了。3.1 SDSRedis字符串Simple Dynamic String不是C语言字符串。C语言字符串char*strhello;问题获取长度O(n) 容易缓冲区溢出SDS结构structsdshdr{intlen;intfree;charbuf[];}优势获取长度O(1) 自动扩容 防止越界四、Redis持久化机制Redis默认存储内存服务器重启数据丢失因此需要持久化。4.1 RDB快照机制。执行bgsave生成dump.rdb优点恢复速度快 文件体积小 适合备份缺点可能丢失最后一次快照之后的数据4.2 AOFAppend Only File。记录写命令日志例如set name Tom set age 18写入appendonly.aof优点数据安全最多丢失1秒缺点文件较大 恢复较慢4.3 如何选择生产环境推荐RDB AOF组合方案。五、Redis缓存设计5.1 缓存穿透什么是缓存穿透请求查询id999999Redis不存在。MySQL也不存在。每次都访问数据库。攻击场景黑客1亿次不存在请求数据库直接崩溃。解决方案方案1缓存空对象set user:999999 null设置expire 300方案2布隆过滤器流程请求 ↓ BloomFilter ↓ Redis ↓ MySQL不存在直接拦截。六、缓存击穿6.1 什么是击穿热点Key商品详情突然过期。瞬间10000请求全部打到数据库。解决方案互斥锁synchronized或者setnx lock流程线程1查询数据库 线程2等待 线程3等待七、缓存雪崩7.1 什么是雪崩大量缓存同时过期例如100万Key 00:00统一失效数据库瞬间崩溃。解决方案随机过期时间错误3600正确3600Random(300)例如369838123921避免同时失效。八、Redis分布式锁8.1 为什么需要分布式锁单机synchronized有效。分布式服务A 服务B 服务C无效。8.2 Redis实现加锁set lock_key uuid nx ex 30解释NX 不存在才创建 EX 过期时间Java代码BooleansuccessredisTemplate.opsForValue().setIfAbsent(lock,uuid,30,TimeUnit.SECONDS);8.3 解锁问题错误写法del lock可能删除别人的锁。正确写法Lua脚本。ifredis.call(get,KEYS[1])ARGV[1]thenreturnredis.call(del,KEYS[1])elsereturn0end保证原子性。九、Redis事务Redis事务MULTI EXEC WATCH开始事务multi执行命令set name Tom set age 18提交exec注意Redis事务不支持回滚这是面试高频题。十、Redis主从复制架构Master ↓ ↓ ↓ Slave Slave Slave作用读写分离 高可用 数据备份配置replicaof 192.168.1.10 6379十一、Redis Sentinel哨兵模式问题Master挂了怎么办引入Sentinel架构Sentinel Sentinel Sentinel ↓ Master ↓ ↓ Slave Slave功能监控监控主节点。自动故障转移Master挂了Slave升级Master自动切换。十二、Redis Cluster集群为什么需要集群单机限制CPU 内存 网络Redis单节点几十GB已经到极限。Cluster方案Redis16384个槽位。计算CRC16(key)%16384例如user:1计算slot1000存储到对应节点。架构Node1 0~5000 Node2 5001~10000 Node3 10001~16383十三、Redis面试高频问题Redis为什么这么快回答1、纯内存操作 2、单线程模型 3、IO多路复用 4、高效数据结构Redis和MySQL如何保证一致性方案先更新数据库 再删除缓存即Cache Aside Pattern流程update mysql delete redis延迟双删update mysql delete redissleep(500ms)delete redis解决并发问题。十四、企业级Redis最佳实践Key命名规范推荐user:1001 order:20250501 product:1避免abc test aaa设置过期时间避免永久缓存。expire key 3600大Key治理避免1个Key 500MB拆分user:1:page1 user:1:page2热Key治理热点数据明星直播 秒杀商品 热搜榜采用本地缓存 Redis集群 多级缓存十五、Redis在真实项目中的应用在线教育平台缓存课程详情 教师信息 章节目录电商系统缓存商品信息 库存信息 购物车社交系统缓存用户关系 粉丝列表 点赞记录游戏系统缓存排行榜 玩家在线状态 战绩统计总结Redis 已经不仅仅是一个缓存数据库而是现代互联网系统中不可或缺的基础设施。本文从Redis核心原理五大数据结构SDS底层实现持久化机制缓存穿透缓存击穿缓存雪崩分布式锁主从复制哨兵模式Redis Cluster企业级最佳实践进行了全面分析。对于 Java 后端开发岗位而言Redis 已经成为面试必问技术栈。如果你准备冲击✅ Java中级工程师✅ Java高级工程师✅ 架构师岗位那么 Redis 的底层原理、缓存架构设计、高并发解决方案一定要深入掌握。如果觉得本文对你有帮助欢迎点赞、收藏、关注后续将持续更新《Redis源码解析》《Redis面试宝典》《Redis高并发实战案例》等系列文章。
Redis 深度解析:从入门到高并发架构实战(万字详解)
前言在现代互联网系统中无论是电商秒杀、社交平台、在线教育还是金融系统几乎都离不开 Redis。很多开发者认为 Redis 只是一个 Key-Value 缓存工具但实际上 Redis 已经发展成为高性能缓存数据库分布式锁实现方案消息队列中间件排行榜系统实时统计系统地理位置服务流处理平台甚至在很多互联网公司中MySQL负责存储数据Redis负责承载流量因此掌握 Redis 已经成为 Java 后端工程师、架构师必备技能之一。本文将从 Redis 的底层原理、数据结构、缓存设计、高并发场景、分布式锁、持久化、集群架构等多个角度进行全面剖析。一、Redis简介1.1 什么是RedisRedisRemote Dictionary Server是一个基于内存的高性能 Key-Value 数据库其特点开源支持持久化支持事务支持发布订阅支持Lua脚本支持集群部署官网https://redis.io1.2 Redis为什么快很多面试官喜欢问Redis为什么快原因主要有以下几点1、基于内存操作MySQLselect*fromuserwhereid1需要磁盘 - 内存 - CPURedis内存 - CPU速度差距磁盘 10ms左右 内存 100ns左右差距超过100000倍2、单线程模型Redis核心命令执行单线程很多人认为单线程一定慢其实这是误区。Redis瓶颈网络IO 内存读写不是CPU计算。单线程避免锁竞争 线程切换 上下文切换反而效率更高。3、IO多路复用Redis采用epoll select kqueue实现一个线程管理多个连接流程客户端A 客户端B 客户端C ↓ epoll监听 ↓ Redis主线程因此可支撑10W 并发连接二、Redis数据类型详解Redis面试最常考内容之一。2.1 String最常用类型。存储结构key - value例如set name zhangsan获取get name结果zhangsan应用场景缓存用户信息set user:1001 {id:1001,name:Tom}计数器incr article:view:1统计阅读量 点赞量 收藏量2.2 Hash类似Java中的Map。存储结构key field - value例如hset user:1 name Tom hset user:1 age 18查询hget user:1 name优势相比String节省内存 方便更新部分字段2.3 List双向链表结构。添加数据lpush list 1 lpush list 2 lpush list 3结果3 2 1应用场景消息队列生产者lpush queue order消费者rpop queue2.4 Set无序且唯一。sadd user 1 sadd user 2 sadd user 3重复元素sadd user 3不会存储。应用场景用户标签sadd vip_users 1001 sadd vip_users 1002共同好友sinter friendA friendB2.5 Sorted SetZSetRedis最经典的数据结构。内部Hash SkipList(跳表)添加zadd rank 100 Tom zadd rank 90 Jack zadd rank 95 Rose查询排行榜zrevrange rank 0 9应用场景游戏排行榜玩家 分数 Tom 100 Rose 95 Jack 90热搜榜微博热搜 抖音热榜 知乎热榜三、Redis底层数据结构很多人只知道String Hash List但面试官问String底层是什么很多人就不会了。3.1 SDSRedis字符串Simple Dynamic String不是C语言字符串。C语言字符串char*strhello;问题获取长度O(n) 容易缓冲区溢出SDS结构structsdshdr{intlen;intfree;charbuf[];}优势获取长度O(1) 自动扩容 防止越界四、Redis持久化机制Redis默认存储内存服务器重启数据丢失因此需要持久化。4.1 RDB快照机制。执行bgsave生成dump.rdb优点恢复速度快 文件体积小 适合备份缺点可能丢失最后一次快照之后的数据4.2 AOFAppend Only File。记录写命令日志例如set name Tom set age 18写入appendonly.aof优点数据安全最多丢失1秒缺点文件较大 恢复较慢4.3 如何选择生产环境推荐RDB AOF组合方案。五、Redis缓存设计5.1 缓存穿透什么是缓存穿透请求查询id999999Redis不存在。MySQL也不存在。每次都访问数据库。攻击场景黑客1亿次不存在请求数据库直接崩溃。解决方案方案1缓存空对象set user:999999 null设置expire 300方案2布隆过滤器流程请求 ↓ BloomFilter ↓ Redis ↓ MySQL不存在直接拦截。六、缓存击穿6.1 什么是击穿热点Key商品详情突然过期。瞬间10000请求全部打到数据库。解决方案互斥锁synchronized或者setnx lock流程线程1查询数据库 线程2等待 线程3等待七、缓存雪崩7.1 什么是雪崩大量缓存同时过期例如100万Key 00:00统一失效数据库瞬间崩溃。解决方案随机过期时间错误3600正确3600Random(300)例如369838123921避免同时失效。八、Redis分布式锁8.1 为什么需要分布式锁单机synchronized有效。分布式服务A 服务B 服务C无效。8.2 Redis实现加锁set lock_key uuid nx ex 30解释NX 不存在才创建 EX 过期时间Java代码BooleansuccessredisTemplate.opsForValue().setIfAbsent(lock,uuid,30,TimeUnit.SECONDS);8.3 解锁问题错误写法del lock可能删除别人的锁。正确写法Lua脚本。ifredis.call(get,KEYS[1])ARGV[1]thenreturnredis.call(del,KEYS[1])elsereturn0end保证原子性。九、Redis事务Redis事务MULTI EXEC WATCH开始事务multi执行命令set name Tom set age 18提交exec注意Redis事务不支持回滚这是面试高频题。十、Redis主从复制架构Master ↓ ↓ ↓ Slave Slave Slave作用读写分离 高可用 数据备份配置replicaof 192.168.1.10 6379十一、Redis Sentinel哨兵模式问题Master挂了怎么办引入Sentinel架构Sentinel Sentinel Sentinel ↓ Master ↓ ↓ Slave Slave功能监控监控主节点。自动故障转移Master挂了Slave升级Master自动切换。十二、Redis Cluster集群为什么需要集群单机限制CPU 内存 网络Redis单节点几十GB已经到极限。Cluster方案Redis16384个槽位。计算CRC16(key)%16384例如user:1计算slot1000存储到对应节点。架构Node1 0~5000 Node2 5001~10000 Node3 10001~16383十三、Redis面试高频问题Redis为什么这么快回答1、纯内存操作 2、单线程模型 3、IO多路复用 4、高效数据结构Redis和MySQL如何保证一致性方案先更新数据库 再删除缓存即Cache Aside Pattern流程update mysql delete redis延迟双删update mysql delete redissleep(500ms)delete redis解决并发问题。十四、企业级Redis最佳实践Key命名规范推荐user:1001 order:20250501 product:1避免abc test aaa设置过期时间避免永久缓存。expire key 3600大Key治理避免1个Key 500MB拆分user:1:page1 user:1:page2热Key治理热点数据明星直播 秒杀商品 热搜榜采用本地缓存 Redis集群 多级缓存十五、Redis在真实项目中的应用在线教育平台缓存课程详情 教师信息 章节目录电商系统缓存商品信息 库存信息 购物车社交系统缓存用户关系 粉丝列表 点赞记录游戏系统缓存排行榜 玩家在线状态 战绩统计总结Redis 已经不仅仅是一个缓存数据库而是现代互联网系统中不可或缺的基础设施。本文从Redis核心原理五大数据结构SDS底层实现持久化机制缓存穿透缓存击穿缓存雪崩分布式锁主从复制哨兵模式Redis Cluster企业级最佳实践进行了全面分析。对于 Java 后端开发岗位而言Redis 已经成为面试必问技术栈。如果你准备冲击✅ Java中级工程师✅ Java高级工程师✅ 架构师岗位那么 Redis 的底层原理、缓存架构设计、高并发解决方案一定要深入掌握。如果觉得本文对你有帮助欢迎点赞、收藏、关注后续将持续更新《Redis源码解析》《Redis面试宝典》《Redis高并发实战案例》等系列文章。