深入剖析 redis 数据淘汰策略
这篇讲的是 Redis 在内存紧张时如何选择“淘汰谁”的策略。当数据集大小超过 maxmemory 限制时,Redis 会启动数据淘汰机制,而策略的选择直接关系到服务的稳定性和数据的访问模式。 文章梳理了 Redis 提供的六种策略。核心思路分为三类:针对设置了过期时间的键(volatile)进行 LRU(最近最少使用)、TTL(最快过期)或随机淘汰;针对所有键(allkeys)进行 LRU 或随机淘汰;以及完全禁止驱逐。作者重点剖析了 LRU 和 TTL 两种机制的实现细节。 有趣的是,Redis 的 LRU 并非一个严格的全局算法。它维护了一个每分钟更新的服务器级 lruclock,在每次淘汰时,会从数据集中随机抽取一批键(由 maxmemory_samples 控制),然后只在这批“样本”中找出 LRU 值最大的那个进行淘汰。TTL 策略的实现方式也类似,是随机采样后淘汰剩余存活时间最长的键。这是一种在性能与效果之间做出权衡的巧妙设计,牺牲了绝对的精确性,换来了极低的计算开销。 文章通过源码揭示了 freeMemoryIfNeeded() 这个核心函数的工作流程:每次执行命令后检查内存,若超标则根据配置的策略,遍历数据库,通过采样找出要驱逐的键值对并删除,同时将此操作同步到 AOF 和从库。理解这些机制,能帮助我们更好地配置 Redis,在缓存命中率、内存使用和性能之间找到最佳平衡点。