Redis 持久化是把内存数据保存到磁盘,防止宕机丢失,有RDB和AOF两种。RDB 是快照持久化,定时把内存全量数据生成二进制文件,恢复速度快、体积小,但会丢失最后一次快照后的数据。AOF 是日志持久化,记录每一条写命令,实时性高、数据更安全,文件体积大、恢复慢。Redis 支持同时开启 RDB+AOF,启动时优先用 AOF 恢复,保证数据一致性,两者互补,满足不同数据安全需求。
Redis 过期策略有三种:定时删除(创建定时器立即删除,耗 CPU)、惰性删除(访问时判断是否过期再删,省 CPU 但耗内存)、定期删除(每隔一段时间抽查删除,平衡 CPU 和内存),默认用惰性 + 定期组合。内存淘汰是内存满时删除数据,共 8 种策略:分不删除、淘汰过期键、淘汰所有键三类,常用volatile-lru(删最近最少使用的过期键)、allkeys-lru(删所有键中最少使用的)、volatile-ttl(删即将过期的),根据业务场景选择。
哨兵是 Redis高可用解决方案,由多个哨兵节点组成集群,监控所有主从节点。核心功能:监控主节点状态,每秒发心跳;主观下线是单个哨兵认为主节点挂了,客观下线是半数以上哨兵确认宕机;之后自动故障转移,从从节点选最优的升为主节点,通知其他从节点同步新主节点,同时更新配置。哨兵还能提供主节点地址,实现故障自动切换,无需人工干预,保证 Redis 服务不间断。
Redis 集群是分布式解决方案,实现数据分片和高可用,把数据分到 16384 个槽(slot),每个主节点负责一部分槽,从节点做备份。客户端计算 key 的 CRC16 值对 16384 取模,找到对应槽和节点。集群支持主从复制、故障转移,节点间互相通信交换状态。跨槽操作会返回重定向,客户端缓存槽映射关系。集群解决了单机内存、并发、流量瓶颈,实现水平扩展,适合大数据量、高并发场景。
Redis 高性能核心原因:纯内存操作,读写速度远快于磁盘;单线程模型,避免线程切换和锁竞争,效率极高;采用IO 多路复用,单线程处理大量网络连接;数据结构优化,底层用简单高效结构(如跳表、哈希表);命令处理极快,大部分命令 O(1) 复杂度;支持管道、批量操作,减少网络开销。单机 QPS 可达 10 万,延迟毫秒级,是内存 + 单线程 +IO 多路复用共同造就的高性能。
Redis 支持 8 种常用数据类型:String(字符串,缓存、计数)、Hash(哈希,对象存储)、List(列表,消息队列、栈)、Set(集合,去重、交集)、ZSet(有序集合,排行榜、限流)、Bitmaps(位图,签到、统计)、HyperLogLog(基数统计)、GEO(地理位置)、Streams(流,消息队列)。不同类型适配不同业务场景,底层实现优化,满足缓存、计数、消息、地理信息等各类需求。
Redis 事务通过MULTI、EXEC、DISCARD、WATCH实现,把命令放入队列,EXEC 批量执行。特性:一次性、顺序性、排他性,但不支持原子性,执行中某命令报错,其他命令仍会执行。限制:不支持回滚、不支持隔离级别、命令入队不执行。和传统数据库区别:传统 DB 有 ACID、回滚、强隔离,Redis 事务轻量、无回滚、性能高。WATCH 命令监控键,键被修改则事务中断,实现乐观锁。
Redis 分布式锁核心用SETNX+ 过期时间,或 Lua 脚本保证原子性。基础实现:SET key value NX EX 超时时间,NX 是仅不存在才设置,EX 防死锁。释放锁用 Lua 脚本判断值一致再删除,避免误删。高级特性:可重入用 ThreadLocal+ 计数,锁续期用定时任务延长时间。分布式锁解决多服务并发抢占资源问题,简单高效,是分布式系统常用方案,注意超时时间和原子释放。
热点 key 是被大量请求同时访问的 key,易压垮节点。解决方案:本地缓存(JVM 缓存)减少 Redis 请求;key 分片,把热点 key 复制成多份(key1、key2),随机访问分散压力;读写分离,从节点承载读请求;降级兜底,缓存失效时用本地默认值;监控预警,提前发现热点 key。核心是分散请求压力,避免单节点过载,保证系统稳定。
Pub/Sub 是 Redis消息通信模型,发布者往频道发消息,订阅者接收。发布者用 PUBLISH 发消息,订阅者用 SUBSCRIBE/PSUBSCRIBE 订阅频道或模式。消息不持久化,订阅者离线会丢失消息,无消息确认机制。适合实时通知、广播场景,如配置刷新、消息推送。相比消息队列,轻量无依赖,但不适合需要可靠投递的业务。
分布式会话把用户 Session 存到 Redis,多服务共享。用户登录后,生成唯一 SessionID,把用户信息存 Redis 并设置过期时间,客户端存 SessionID。所有服务请求时携带 SessionID,从 Redis 获取用户信息。Redis 集群保证高可用,过期策略自动清理失效会话。实现多服务 Session 共享,解决单机 Session 无法共享问题,适配分布式、微服务架构。
Lua 脚本让 Redis命令原子执行,避免并发问题。场景:分布式锁释放、限流(计数器 + 滑动窗口)、批量操作(减少网络 IO)、库存扣减、复杂业务逻辑(如秒杀判断)。脚本一次性发送执行,减少网络开销,保证原子性。Redis 缓存脚本,重复执行效率高,是实现复杂原子操作的最佳方案,替代多条命令的并发风险。
Bitmaps 用 String 类型实现,按 bit 位存储,节省内存,每 bit 代表 0 或 1。命令 SETBIT、GETBIT、BITCOUNT、BITOP。场景:用户签到(每天 1bit)、在线状态、活跃用户统计、布隆过滤器、权限标记。1 亿用户仅占 12MB 内存,统计效率极高,适合大量二值状态的存储和统计。
HyperLogLog 是基数统计算法,用极小内存统计不重复元素数量,误差率 <1%。底层用哈希 + 分桶估算基数,不存储原始数据。命令 PFADD、PFCOUNT、PFMERGE。场景:UV 统计、日活、月活、独立 IP 数。内存占用仅 12KB,支持海量数据统计,适合不需要精确值、追求省内存的场景。
GEO 基于 ZSet 实现,存储地理位置信息(经纬度),命令 GEOADD、GEORADIUS、GEODIST。存储经纬度和位置名称,计算两点距离、查找附近位置。场景:附近的人、外卖商家、地图 POI、网约车、物流配送。内置地球半径算法,查询高效,无需第三方 GIS 库,轻量易用。
Streams 是 Redis持久化消息队列,5.0 新增,支持消息持久化、消费组、回溯消费、消息确认。底层是链表 + 哈希表,每条消息有唯一 ID。场景:异步任务、日志采集、订单通知、微服务通信。相比 Pub/Sub,支持持久化、消费确认、分组消费,是可靠消息队列,替代专业 MQ 的轻量场景。
ZSet 有序集合底层用压缩列表(小数据)+ 跳表(大数据),跳表实现有序和快速查找,哈希表保证成员唯一性。按 score 排序,支持范围查询、排名。优化:避免大量大范围查询,用 limit 限制;小数据用压缩列表省内存;热点 ZSet 拆分;避免频繁更新 score。适合排行榜、限流、延时队列、优先级队列。
管道(Pipeline)把多条命令批量发送,Redis 批量执行后一次性返回结果,减少网络往返次数。网络 IO 是 Redis 性能瓶颈,管道大幅降低 RTT,提升批量操作效率。适合批量插入、批量查询、批量删除,如初始化数据、批量缓存。注意管道不保证原子性,仅减少网络开销,原子批量用 Lua 脚本。
Redis 键过期通过过期字典存储键的过期时间,配合惰性删除 + 定期删除实现。访问键时,惰性删除判断是否过期并删除;后台定期任务随机抽查过期键,批量删除。不会立即删除所有过期键,平衡 CPU 和内存。过期时间用 EXPIRE、PEXPIRE 设置,永久键用 PERSIST 清除,保证内存不被过期键占满。
内存优化:选合适数据类型(小数据用压缩列表、ziplist);开启 lazy free 懒惰删除;清理过期键;合并小对象;避免大 key。内存碎片是内存分配后无法复用,Redis4.0+ 支持主动碎片整理,配置 activedefrag 开启,自动合并空闲内存。也可重启 Redis 释放碎片,适合低峰期操作,保证内存高效利用。
哨兵是高可用方案,解决单点故障,不实现数据分片,单主多从,数据全量同步,适合中小数据量。集群是分布式方案,数据分片(16384 槽),多主多从,水平扩展,支持海量数据,高并发。哨兵专注故障转移,集群专注分片扩容,可结合使用,哨兵监控集群节点,兼顾高可用和分布式。
Redis 用IO 多路复用单线程处理大量连接,配置 maxclients 限制最大连接数;开启TCP backlog优化连接队列;使用短连接或连接池,避免连接泄漏;开启 tcp-keepalive 检测死连接;用集群分散连接压力;升级 Redis6.0+ 用多线程 IO,提升网络处理能力。保证高并发下连接不阻塞,服务稳定。
主从复制实现读写分离,主写从读。原理:首次全量同步,主生成 RDB 发送给从,从加载并记录缓冲区命令;后续增量同步,主把写命令发给从执行。通过偏移量 + 复制 ID保证一致性,断线重连增量同步。主从异步复制,有短暂延迟,哨兵解决主从故障切换,是集群和高可用的基础。
Redis 排序用SORT 命令,对 List、Set、ZSet 排序,支持 BY(按外部键排序)、LIMIT(分页)、GET(获取外部值)、ASC/DESC、ALPHA(字符串排序)、STORE(保存结果)。SORT 是临时排序,大数据量耗 CPU,适合小数据量排序。大数据排序建议用 ZSet 有序存储,避免实时排序开销。
缓存雪崩:大量 key 同时过期 /Redis 宕机,请求压垮 DB。解决:过期时间加随机值、集群、熔断降级、多级缓存。缓存穿透:查不存在的数据,绕过缓存查 DB。解决:布隆过滤器、缓存空值、参数校验。缓存击穿:热点 key 过期,大量请求查 DB。解决:互斥锁、永不过期、本地缓存、热点 key 预热。
Redis 同时开启 RDB 和 AOF 时,启动优先加载 AOF,AOF 保证数据更完整。AOF 和 RDB 不一致时,以 AOF 为准,因为 AOF 记录所有写命令,数据丢失更少。Redis 会自动校验文件完整性,损坏则用备份恢复。AOF 重写时会生成新文件,保证数据准确,RDB 作为备份,两者互补保障数据安全。
监控用INFO 命令查看内存、连接、命中率、持久化;REDIS-MONITOR实时查看命令;REDIS-CLI INFO STATS看统计;开源工具 Prometheus+Grafana、Redis Exporter、Redis Insight。监控指标:内存使用率、命中率、连接数、慢查询、持久化状态、主从延迟,提前发现故障,保证稳定运行。
Redis 安全:密码认证(requirepass);绑定 IP(bind)限制访问;保护模式默认开启;命令重命名(rename-command)禁用危险命令;TLS 加密传输;权限控制(Redis6+ACL),分用户权限;禁止外网暴露端口,配合防火墙。多层防护,防止未授权访问和数据泄露。
懒惰删除(lazy free)是 Redis异步删除大 key,避免删除大 key 阻塞主线程。删除大 key 时,把数据丢给后台子线程异步释放内存,主线程继续处理命令。配置 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 开启。解决大 key 删除卡顿问题,保证主线程流畅,Redis4.0+ 支持。
List 底层:小数据用压缩列表(ziplist),省内存;大数据用快速列表(quicklist),双向链表 + 压缩列表,兼顾读写和内存。优化:控制元素大小,避免大元素;用 LPUSH/RPUSH 批量插入;少用 LRANGE 大范围查询;小列表用压缩列表,减少内存占用。适合消息队列、栈、队列、 timeline 流。
Redis 集群数据分 16384 槽,多 key 不在同一槽会报错。解决:用哈希标签({}),如 {user}1、{user}2,计算{} 内字符串的槽,保证同槽;客户端重定向,接收 MOVED/ASK 响应,更新槽映射;批量操作用 Pipeline 或 Lua 脚本(同槽)。跨槽操作避免,必须同槽用哈希标签,保证命令正常执行。
延迟队列用ZSet实现,把消息作为 member,延迟时间作为 score。生产者添加消息,消费者用 ZRANGEBYSCORE 查询到期消息,删除并处理。用 Lua 脚本保证查询 + 删除原子性,多线程竞争用分布式锁。支持任意延迟时间,轻量无依赖,适合订单超时、任务延时、消息重试,替代专业延迟 MQ。
消息队列三种方案:List(LPUSH+BRPOP,轻量,无持久化保障);Streams(XADD+XREADGROUP,持久化、消费组、确认,可靠);ZSet(延迟队列)。Streams 是官方推荐,支持持久化、回溯、分组消费,适合异步任务、日志、通知,轻量可靠,无需独立 MQ 组件。
Redis 是单线程主线程,读写命令串行执行,无并发写冲突。读命令无锁,写命令顺序执行,天然避免竞争。并发问题来自客户端,用 Lua 脚本、分布式锁、WATCH 命令解决。主从异步复制有短暂延迟,读写分离读从节点可能脏数据,强一致读主节点。
Redis 高可用:主从复制(数据备份)+哨兵模式(故障自动切换),主节点宕机,哨兵自动选从升主,通知客户端。集群模式:多主多从,分片 + 故障转移,水平扩展。配合持久化、监控、熔断降级,保证 7×24 小时服务,数据不丢失,故障自动恢复。
主从通过复制 ID+ 偏移量标识数据状态,全量同步 + 增量同步保证一致。主节点记录复制偏移量,从节点同步确认,断线重连后增量同步缺失命令。Redis6.0+ 支持无盘复制,提升同步效率。异步复制有毫秒级延迟,强一致用同步复制(性能低),兼顾性能和一致性。