Dev Guide / Java开发技术guide / 中间件
content/dev-guide/a-Java开发技术guide/04-中间件/3-redis.md
- redis特性:基于内存、单线程模型(网络IO+命令执行,单线程减少上下文切换,避免锁竞争)、IO多路复用(基于 Reactor 模式,使用epoll/kqueue高效处理大量客户端连接)、多种的数据结构、持久化支持、高可用架构(主从复制、哨兵模式、Cluster 集群)
- redis为什么快:纯内存操作、单线程避免竞争、IO多路复用、高效的数据结构、模块化设计(事件驱动模型,逻辑清晰)
- 基本数据类型:String、List、Hash(对象存储,类比HashMap)、Set、ZSet(有序去重)、BitMap(位图,01状态)、HyperLogLog(基数统计)、Streams(消息队列)
- 持久化机制
- RDB(redis db):定时生成内存快照 (二进制文件 dump.rdb)。文件紧凑,恢复速度快
- AOF:每次写操作命令时记录,重启时重放(从头到尾重新执行一遍写操作,从而把内存数据恢复到宕机前的状态)。刷盘策略(always:每次写入同步刷盘、everyseconds:每秒同步刷盘、no:由操作系统决定,性能最好)、AOF重写(为什么要重写:AOF文件越来越大 → 重启重放极慢。不修改旧的AOF文件,基于当前内存数据,生成一个全新的、体积最小的 AOF 文件,用最少量的命令还原数据状态。执行原子替换后删掉旧的AOF文件)。文件体积大,恢复速度慢(数据更安全、文件可读)
- 混合持久化:AOF 重写时,将当前内存数据以 RDB 格式写入 AOF 文件头部(RDB快照快速恢复),后续增量命令以 AOF 格式追加(结合 RDB 加载快 + AOF 数据安全性高的优点)。
- 高可用与集群架构
- 主从模式:读写分离,数据备份(流程:Slave 发送 PSYNC 请求 -> Master 执行 BGSAVE 生成 RDB -> Master 发送 RDB 给 Slave -> Master 发送缓冲区增量命令 -> Slave 加载 RDB 并重放增量命令)
- 哨兵模式:监控(定期检查 Master/Slave 状态),自动故障转移(单个哨兵认为Master挂了/多个哨兵认为Master挂了,选举 Leader 哨兵执行故障转移:选择优先级高、复制进度新的 Slave 升 Master))、配置中心
- Cluster 集群:水平扩展、高可用、海量数据存储。
- redis高级特性:
- 事务(多个命令打包且按顺序执行,不支持回滚):批量执行是原子的,但运行时错误不中断、不回滚,不符合完整原子性(部分满足)、仅 EXEC 阶段串行,入队期无隔离,无脏读/不可重复读概念(隔离性极弱)、由 Redis 持久化策略(RDB/AOF)决定,与事务本身无关、一致性不保证
- 支持Lua脚本:保证复杂操作的原子性,脚本内的命令串行执行
- 发布订阅:原生提供发布订阅(Pub/Sub)功能,但它的定位是“轻量级实时广播”
- 应用场景:
- 缓存加速:热点数据缓存、Session 共享、配置热更新、防缓存穿透/击穿/雪崩
- 并发控制与协调(分布式锁、接口幂等、限流防刷、分布式ID)
- 特色数据结构业务化(排行榜、社交关系、签到/在线状态、点赞)
- 缓存一致性策略:先删缓存,再删数据库(并发可能存在脏数据);先更新数据库,再删缓存(问题:删除缓存失败怎么办?重试机制、消息队列异步删除、Canal监听binlog删除缓存。推荐旁路缓存模式);延迟双删(解决主从延迟:更新库 → 删缓存 → 休眠 N 毫秒 → 再删缓存)、强一致(不使用缓存)
- 业务需求与redis应用:
- 接口响应大于200ms,DB压力大:String/Hash缓存+旁路缓存模式(优势:内存读写<1ms,TTL自动过期,架构简单)
- 防止重复提交/并发扣库存:Redisson分布式锁+业务幂等校验(单线程互斥、Lua安全释放,看门狗续期)
- 短信/验证码1分钟限1次:INCR + EXPIRE 或 令牌桶Lua(原子计数,零外部依赖)
- 订单创建后30分钟未支付自动取消:ZSet延迟队列(时间戳)或Redis Streams(精准触发、支持重试、比定时任务更轻量)
- 实时商品销量排行榜:ZINCRBY + ZRANGE(跳表维护有序性,O(logN)更新和查询)
- 每日活跃用户去重统计(千万级):HyperLogLog(PFADD、PFCOUNT)(误差极小,内存仅12kb,比Set省99%空间)
- 用户签到/连续签到记录:BitMap(SETBIT、GETBIT),1位1天,30天仅4字节,位运算极快
- 视频点赞:Redis缓存+MQ削峰异步落库+DB保底+定时对账(SADD/SREM/SISMEMBER + INCR/DECR。数据一致性、高可用、高可用、高可用)
- 点赞实现:页面乐观更新(更新图标、点赞计数)+请求发出(redis更新点赞计数,接口返回结果)+MQ 异步落库(不阻塞响应,落库成功则保持多端一致)+请求失败(网断了/接口崩了/Redis 同步写失败,页面回滚更新)