
一、前言Redis 是互联网高并发系统的核心缓存中间件绝大多数线上性能抖动、接口超时、CPU飙升、内存溢出、数据库雪崩问题本质都源于编码不规范、Key设计混乱、BigKey堆积、连接池配置不合理、内存淘汰策略误用、运维缺失。很多项目只实现了“能用”完全没有达到“稳定、高性能、可运维”的生产标准。本文系统性整理企业级 Redis 缓存设计规范与全套优化方案帮助团队彻底规避线上缓存事故。二、Redis 企业级开发编码规范2.1 Key 命名规范(可读性与可管理性)统一格式业务模块:业务类型:唯一标识例如goods:info:10001禁止中文、特殊符号、过长KeyKey长度尽量控制在 30 字符以内禁止全局无差别 Key避免 Key 冲突、误删除下线业务及时清理废弃 Key杜绝内存堆积2.2 过期时间规范所有业务缓存必须设置过期时间禁止永久Key热点数据除外批量数据过期时间随机打散±1~5分钟随机偏移防止缓存雪崩超时时间大于业务最大执行时间避免锁提前失效、数据错乱2.3 数据存储规范禁止存储超大文本、序列化冗余数据、二进制大文件优先使用压缩序列化方式减少内存占用冷热数据分离冷数据归档MySQL/ESRedis只存热点数据2.4 代码操作规范禁止使用keys、flushall、flushdb、hgetall等高危阻塞命令,通过redis的rename机制禁掉命令或者使用scan的方式渐进式处理批量读写优先使用 Pipeline、Lua 脚本减少网络IO所有 Redis 操作必须增加超时时间、异常捕获、降级兜底删除大Key禁止直接 DEL必须分批渐进删除三、Redis BigKey 全方位治理原因危害解决方案预防3.1 行业 BigKey 判定标准StringValue 大于 10KBHash/List/Set/ZSet元素数量大于 5000 个3.2 BigKey 产生核心原因业务设计不合理单Key承载全量列表、全量配置、全量日志数据,存储数据未做精简,图方便全量存储无过期策略统计类、记录类数据只增不减永久堆积批量未分页一次性全量同步数据库数据至缓存迭代遗留脏数据下线业务Key未清理长期冗余堆积冷热数据不分离冷数据、归档数据长期占用Redis内存3.3 BigKey 线上致命危害阻塞单线程Redis主线程阻塞所有命令排队超时接口雪崩主从同步延迟暴涨大Key传输耗时极高复制积压严重集群内存倾斜单节点内存爆满触发淘汰、OOM、分片失衡带宽打满大Key读写占用大量网卡挤压正常业务流量,造成网络堵塞缓存命中率下降大Key挤占内存热点Key被提前淘汰3.4 已有 BigKey 紧急解决方案大Key拆分按时间、ID、分类维度拆分为多个小Key分散压力选择合适的数据类型: 按照实际业务场景和特点选择合适的存储数据类型,注意节省内存和性能之间的平衡控制key的生命周期: 按需设定对应的过期时间,最好设置随机偏移量,防止同一时间过期,导致缓存击穿,甚至雪崩渐进式删除用hscan、sscan、zscan分批遍历删除禁止直接 DEL数据分页加载不再全量获取按需查询、分页返回冷热分离冷数据迁移数据库Redis只保留热点数据3.5 常态化预防手段所有Key强制过期避免无限堆积批量写入必须分页、分片线上开启大Key监控告警定期巡检、清理下线脏Key四、Redis 常用核心命令详解生产可用高危禁用4.1 高频安全常用命令GET / SET常规读写支持 NX/EX 原子加锁性能极高EXPIRE / TTL设置过期时间、查看剩余过期时间INCR / INCRBY原子计数器用于库存、限流、点赞HSET / HGET / HMGETHash结构化存储适合对象缓存SCAN / HSCAN迭代遍历Key无阻塞替代keysPERSIST移除Key过期时间RENAMENX安全重命名Key避免覆盖4.2 生产高危禁止命令线上绝对禁用KEYS *全库遍历阻塞主线程大库直接卡死集群FLUSHALL / FLUSHDB清空所有数据极易引发生产事故HGETALL一次性获取所有Hash元素大Hash直接阻塞DEL 大Key瞬间释放海量内存阻塞主线程、引发集群抖动五、Redis 连接池优缺点 生产参数配置详解Redis 客户端不建议频繁创建销毁连接连接池是生产唯一标准方案主流使用 Lettuce / Jedis 连接池。5.1 连接池核心优点降低连接开销避免频繁建立、关闭TCP连接减少三次握手/四次挥手损耗提升吞吐性能连接复用极大提升QPS降低接口RT连接可控可治理统一限制最大连接数防止连接耗尽、服务雪崩自动回收空闲连接释放闲置连接资源避免连接泄露支持超时、重试、保活机制稳定性远高于单连接5.2 连接池缺点配置不当极易出问题最大连接过小导致等待阻塞过大导致Redis连接打爆存在连接闲置开销长期保留空闲连接占用少量服务资源需定期维护需配置空闲检测、保活机制否则会出现无效连接高并发竞争锁连接池获取连接存在轻微锁竞争开销5.3 生产常用连接池参数详解表格版参数名称作用说明生产推荐值配置不当风险max-total最大活跃连接数控制并发连接上限20~50过小阻塞请求过大打爆Redis连接数max-idle最大空闲连接数10~20过小频繁创建连接过大浪费资源min-idle最小空闲连接数保活基础连接50会导致冷启动频繁新建连接max-wait获取连接最大等待时间100ms过久导致接口超时过小直接抛异常idle-timeout空闲连接超时回收时间30s过长堆积无效连接过短频繁销毁重建test-on-borrow获取连接时校验可用性falsetrue损耗性能生产建议后台检测test-while-idle空闲时检测连接有效性true防止连接断连、无效连接残留5.4 核心配置总结高并发场景适当调高max-total、缩短max-wait、开启空闲检测连接池的最佳性能是max_total max-idle这样就避免连接池伸缩带来的性能干扰;低并发场景降低空闲连接数量节约服务资源,般推荐max-idle可以设置为按上面的业务期望QPS计算出来的理论连接数maxTotal可以再放大一倍。如果系统启动完马上就会有很多的请求过来那么可以给redis连接池做预热比如快速的创建一些redis连接执行简单命令类似ping()快速的将连接池里的空闲连接提升到minIdle的数量。六、Redis 内存淘汰策略8种策略算法详解Redis对于过期键有三种清除策略1. 被动删除当读/写一个已经过期的key时会触发惰性删除策略直接删除掉这个过期key2. 主动删除由于惰性删除策略无法保证冷数据被及时删掉所以Redis会定期主动淘汰一批已过期的key3. 当前已用内存超过maxmemory限定时触发主动清理策略主动清理策略在Redis 4.0 之前一共实现了 6 种内存淘汰策略在 4.0 之后又增加了 2 种策略总共8种6.1 八种淘汰策略完整说明策略名称淘汰规则适用场景noeviction不淘汰任何Key内存满直接报错纯数据库、禁止丢数据场景allkeys-lru全局所有Key淘汰最久未使用通用缓存场景生产最常用volatile-lru只淘汰带过期Key最久未使用优先保留永久核心数据淘汰临时缓存allkeys-lfu全局所有Key淘汰使用频次最少访问频次差异大的业务volatile-lfu仅过期Key淘汰频次最少需保留低频核心数据场景allkeys-random全局随机删除Key测试、临时场景volatile-random过期Key随机删除极少使用volatile-ttl优先删除剩余过期时间最短Key希望短期缓存优先淘汰场景6.2 LRU 算法原理LRULeast Recently Used最近最少使用核心思想“谁最久没被访问优先淘汰谁”。Redis 并非严格 LRU而是近似LRU随机采样部分Key淘汰其中最久未使用的以最近一次访问时间作为参考,节省CPU、保证高性能足够满足生产。LRU 核心优点算法逻辑简单、计算开销极低对Redis性能几乎无损耗贴合大部分常规业务优先保留近期活跃的热点数据适配性广、稳定性高是通用场景的最优选择。LRU 核心缺点无法识别访问频次只看访问时间、不看访问次数存在冷热数据误淘汰问题偶尔访问的冷门数据会长期占用内存高频访问但短暂静默的热点数据容易被误淘汰针对周期性热点业务适配性较差。6.3 LFU 算法原理LFULeast Frequently Used最少频次使用(以次数作为参考)核心思想“谁访问次数最少优先淘汰谁”。解决 LRU 缺陷部分长期不用但偶尔访问的热点数据不会被误淘汰更贴合真实业务冷热分布。LFU 核心优点精准识别真实冷热数据以访问频次判定热度规避LRU误淘汰问题长期高频热点数据永久优先保留缓存命中率更高适配周期性、阶段性热点业务场景抗数据抖动能力更强。LFU 核心缺点需要统计、更新访问频次CPU计算开销略高于LRU存在频次固化问题旧热点数据累积大量访问次数变为冷数据后仍长期占用内存新热点数据难以顶替Redis LFU 需配合时间衰减机制优化原生默认策略存在短板。6.4 LRU与LFU 全方位对比 场景选型对比维度LRU最近最少使用LFU最少频次使用淘汰依据最后一次访问时间历史访问总频次性能开销极低无计数统计略高需要维护访问计数器冷热识别精度一般易误判冷热数据极高精准区分真实热点/冷数据新旧热点适配适配新热点容易淘汰旧高频热点偏爱旧高频热点新热点起步慢典型缺陷短时冷门数据常驻内存老热点频次固化僵尸数据难淘汰通用适配场景绝大多数常规业务、流量平稳业务热点固定、访问频次差异极大的业务6.5 生产精准选型规范优先选用 LRUallkeys-lru业务流量波动大、新热点频繁更替常规缓存业务、首页数据、商品列表、用户临时数据追求极致性能、低CPU开销的场景。优先选用 LFUallkeys-lfu业务热点固定存在长期高频访问数据存在大量偶尔访问的僵尸冷数据需要精准清理缓存命中率低、LRU误淘汰严重的场景。6.6 其余六种淘汰策略选型结论存在永久核心数据volatile-lru / volatile-lfu只淘汰带过期临时数据短期缓存优先过期淘汰volatile-ttl严禁丢数据noeviction需严格管控内存内存满直接报错不淘汰测试临时场景allkeys-random / volatile-random生产禁止使用通用业务缓存allkeys-lru企业标配存在永久核心数据volatile-lru冷热频次差异极大allkeys-lfu严禁丢数据noeviction需严格管控内存