Redis 相关知识点整理

📅 发布时间:2026/7/4 19:33:39 👁️ 浏览次数:
Redis 相关知识点整理
一、Redis 基础认知1. 核心定位Redis 是基于内存的键值型 NoSQL 数据库Java 开发中核心用于缓存减轻 MySQL 压力、分布式锁、计数器、排行榜、限流等场景是 Java 后端高性能架构的核心组件。2. 为什么快Java 面试必答Redis 高性能的核心原因需结合 Java 开发视角理解纯内存操作数据存储在内存读写延迟远低于磁盘Java 中需注意 Redis 内存占用避免 OOM单线程模型核心命令Redis 核心命令执行为单线程避免 Java 多线程的上下文切换、锁竞争开销补充Redis 6.0 引入多线程 IO仅处理网络读写命令执行仍为单线程Java 客户端无需适配多线程逻辑IO 多路复用基于 epoll 实现单线程处理数千个网络连接对应 Java NIO 的 Reactor 模式避免阻塞 IO 的性能瓶颈数据结构优化底层编码如 ziplist、跳表适配高频操作Java 开发无需关心底层但需知道不同数据结构的性能特性。3. 开发选型Redis vs Memcached维度RedisMemcachedJava 开发选型建议数据结构支持 String/Hash/List/ZSet 等仅支持 StringJava 复杂业务如排行榜、对象缓存选 Redis持久化支持 RDB/AOF不支持Java 项目需数据落地如缓存重启不丢失选 Redis集群方案原生 Cluster / 哨兵Java 客户端Redisson/Jedis原生支持需第三方集群方案Java 客户端支持弱分布式 Java 项目选 Redis客户端生态Jedis基础、Redisson高级封装分布式锁 / 集合成熟Java 客户端生态薄弱优先 Redis二、核心数据结构Java 开发高频场景数据结构核心特点Java 开发典型场景底层编码面试深问String二进制安全支持原子增减incr/decr1. 分布式 IDincr 生成2. 缓存简单对象JSON 序列化3. 计数器点赞数 / 阅读量短字符串→embstr长字符串→raw整数→intJava 序列化对象需控制长度避免编码切换Hash键值对集合适合存储对象减少 Key 数量缓存用户 / 商品对象如 user:1001 的 name/age/phone避免 String 序列化 / 反序列化开销少量字段→ziplist大量字段→hashtableJava 中需控制字段数量避免性能下降List双向链表支持阻塞读写1. 简单消息队列异步通知2. 最新消息列表少量元素→ziplist大量元素→linkedlistJava 中阻塞读取blpop需处理超时Set无序唯一支持交集 / 并集 / 差集1. 共同好友2. 抽奖去重3. 数据去重整数元素→intset其他→hashtableJava 中集合运算如 sinter需注意性能ZSet有序唯一按 score 排序支持范围查询1. 排行榜游戏积分 / 商品热度2. 延迟队列少量元素→ziplist大量元素→跳表 hashtableJava 中 zrevrange 是高频操作特殊数据结构拓展场景Bitmap按位存储极致省空间Java 中用于用户签到、在线状态统计HyperLogLog极小空间统计海量数据基数Java 中用于 UV 统计容忍 0.81% 误差Geospatial存储经纬度Java 中用于「附近的人」等 LBS 场景Stream持久化消息队列Java 中替代 List 解决消息丢失问题支持消费组类似 Kafka。三、Redis 核心特性1. 过期策略与内存淘汰1过期策略Redis 采用「惰性删除 定期删除」惰性删除访问 Key 时检查过期需注意过期 Key 若长期不访问会导致内存泄漏定期删除每 100ms 随机扫描部分 KeyJava 开发无需干预但需合理设置过期时间。2内存淘汰策略面试必答策略Java 应用场景volatile-lru业务缓存仅淘汰带过期时间的 KeyJava 项目中缓存用户 / 商品数据优先选allkeys-lru纯缓存场景所有 Key 都是缓存Java 中如缓存热点数据noeviction不淘汰拒绝写操作Java 中金融类项目不允许数据丢失可选2. 事务Redis 事务特性弱原子性、无回滚、无隔离级别Java 开发中几乎不直接使用 Redis 事务替代方案简单原子操作使用 Redis 单命令如 incr、hincrby天然原子复杂原子操作使用 Lua 脚本Jedis/Redisson 支持一次性执行多个命令分布式事务Java 中用 Seata Redis或 Redisson 的分布式事务组件。3. 管道Pipeline用于批量操作如批量插入数据核心价值减少网络往返次数RTTJedis/Redisson 均支持 Pipeline需注意Pipeline 无原子性Java 中需处理部分命令失败的情况批量操作时Pipeline 性能远高于循环单命令。四、Redis 持久化Java 开发核心配置1. RDB vs AOFJava 面试核心对比维度RDB快照AOF追加日志Java 项目选型建议原理定时将内存数据快照写入磁盘记录所有写命令重启重放-数据安全性低两次快照间数据丢失高最多丢 1 秒Java 核心业务如订单缓存选 AOF恢复速度快慢Java 项目重启时RDB 适合快速恢复性能开销低fork 子进程高写日志Java 高并发场景需平衡性能与安全2. Java 项目持久化配置原则生产环境开启「RDB AOF混合持久化」兼顾数据安全与恢复速度AOF 同步策略选 everysec平衡安全与性能Java 金融项目可考虑 always混合持久化Redis 4.0 支持Java 项目开启后重启时先加载 RDB再重放 AOF 增量日志。五、Redis 集群Java 开发核心方案1. 主从复制原理主库写、从库读Java 客户端可配置读写分离JedisPool 分主从池关注点主库宕机后需手动切换生产环境需配合哨兵。2. 哨兵Sentinel核心功能监控主从、自动故障转移Java 客户端Jedis/Redisson原生支持哨兵模式无需额外开发关注点配置哨兵地址列表客户端自动感知主库切换无需重启应用。3. Redis Cluster分片集群原理16384 个哈希槽数据按槽分布Java 客户端需支持槽位计算Java 适配Jedis使用 JedisCluster自动处理槽位重定向Redisson原生支持 Cluster封装更友好注意Java 中避免跨槽的批量操作如 mset 操作不同槽的 Key会降低性能。六、缓存核心问题1. 三大问题核心对比 面试高频问题定义Java 核心解决方案缓存穿透请求不存在的 Key打穿到 DB1. 缓存空值设置短过期2. 布隆过滤器Java 中用 Guava BloomFilter 或 Redis 布隆过滤器模块缓存击穿热点 Key 过期大量请求打 DB1. 热点 Key 永不过期2. 分布式锁仅一个请求查 DB缓存雪崩大量 Key 同时过期 / Redis 宕机所有请求打 DB1. 过期时间加随机值2. Redis 集群高可用3. 多级缓存本地缓存 Caffeine Redis2. 缓存与数据库一致性Java 核心方案核心原则禁止「先更缓存再更 DB」并发必出脏数据基础方案先更 DB再删缓存Java 中用 RedisTemplate.delete ()而非更新缓存进阶方案延迟双删删缓存→更 DB→延迟 1-2 秒再删缓存Java 中用线程池 / 定时任务实现延迟强一致性场景Java 中用分布式事务Seata或消息队列RocketMQ异步更新缓存。七、Redis 分布式锁Java 开发核心1. 基础实现RedisTemplate核心逻辑原子加锁set nx ex 原子释放Lua 脚本Java 中需注意加锁redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS)requestId 避免误删释放Lua 脚本一次性执行原子性避免「查值 删除」非原子导致的误删。2. 进阶实现RedissonJava 中优先使用 Redisson封装了分布式锁的所有核心能力可重入锁RedissonLock 支持重入适配 Java 多线程重入场景锁续期Watch Dog 机制自动续期解决业务执行时间超过锁过期时间的问题公平锁避免线程饥饿适配 Java 公平锁场景RedLock多节点加锁避免 Redis 单点故障导致锁失效Java 中用 RedissonRedLock 实现。3. Java 开发避坑点必须设置过期时间避免死锁释放锁必须校验 requestId避免误删其他线程的锁高并发场景优先用 Redisson而非手动实现避免踩坑。八、面试高频题核心答案1. Redis 单线程为什么能支撑高并发答Redis 核心命令执行是单线程但结合以下特性支撑高并发纯内存操作无磁盘 IO 瓶颈IO 多路复用处理大量网络连接避免阻塞 IO单线程避免线程切换和锁竞争开销补充Redis 6.0 多线程仅处理网络读写命令执行仍为单线程Java 客户端无需适配多线程逻辑。2. 如何解决缓存穿透 / 击穿 / 雪崩答穿透缓存空值短过期 布隆过滤器Guava/Redis拦截无效请求击穿热点 Key 永不过期 分布式锁Redisson限制查 DB 的请求数雪崩过期时间加随机值 Redis 集群高可用 多级缓存Caffeine 本地缓存 Redis。3. 如何实现 Redis 分布式锁答基础版用 RedisTemplate 执行 set nx ex 原子加锁Lua 脚本原子释放进阶版使用 Redisson支持可重入、锁续期、公平锁、RedLock注意事项加锁设过期时间、释放锁校验 requestId、高可用场景用 RedLock。4. 如何保证缓存和数据库一致性答核心原则是「先更数据库再删缓存」基础场景更新 DB 后调用 RedisTemplate.delete () 删除缓存并发场景延迟双删删缓存→更 DB→延迟 1-2 秒再删强一致性场景用 Seata 分布式事务或 RocketMQ 异步更新缓存。总结Java 开发中 Redis 核心应用场景缓存、分布式锁、计数器、排行榜需结合数据结构特性选型缓存三大问题的核心解决思路拦截无效请求、避免批量过期、保证 Redis 高可用分布式锁优先用 Redisson遵循「原子加锁、原子释放、设置过期时间」三大原则缓存与 DB 一致性核心先更 DB 再删缓存避免先更缓存的脏数据问题。