1人参与 • 2025-03-10 • Redis
redis 作为高性能的内存数据库,其内存资源的高效管理直接关系到系统的稳定性和性能。当 redis 的内存使用达到配置的最大值(maxmemory)时,新的写入操作将触发内存淘汰机制(eviction policy),以释放空间存储新数据。本文将深入探讨 redis 的内存淘汰策略、实现原理、适用场景及最佳实践。
redis 的内存淘汰策略决定了在内存不足时,如何选择需要删除的键来释放空间。这些策略可以分为两大类:
redis 支持以下 8 种内存淘汰策略:
noeviction:默认策略,禁止写入新数据,直接返回错误。
volatile-lru:淘汰最近最少使用(lru)的设置了过期时间的键。
volatile-lfu:淘汰最不经常使用(lfu)的设置了过期时间的键。
volatile-random:随机淘汰设置了过期时间的键。
volatile-ttl:优先淘汰剩余生存时间(ttl)最短的键。
allkeys-lru:淘汰所有键中最近最少使用的键。
allkeys-lfu:淘汰所有键中最不经常使用的键。
allkeys-random:随机淘汰任意键。
行为:当内存不足时,拒绝所有写入命令(如 set、lpush),但允许读取操作。
适用场景:适用于数据不可丢失的场景(如持久化存储),需确保内存足够或配合持久化机制。
缺点:若内存不足且无持久化,可能导致服务不可用。
原理:淘汰最近最久未被访问的键。
redis 实现:redis 使用近似 lru 算法,通过随机采样(默认取 5 个键)选择最久未使用的键,而非遍历所有键,以减少计算开销。
适用场景:适用于缓存场景,优先保留热点数据。
命令示例:
config set maxmemory-policy volatile-lru # 针对带过期时间的键 config set maxmemory-policy allkeys-lru # 针对所有键
原理:淘汰访问频率最低的键(redis 4.0 引入)。
redis 实现:通过计数器统计键的访问频率,并随时间衰减历史计数,避免长期累积导致无法淘汰旧键。
适用场景:适合长期缓存,如高频访问的静态数据。
命令示例:
config set maxmemory-policy volatile-lfu # 针对带过期时间的键 config set maxmemory-policy allkeys-lfu # 针对所有键
原理:优先淘汰剩余生存时间(ttl)最短的键。
适用场景:适用于明确知道键生命周期的场景(如临时会话数据)。
限制:仅对设置了过期时间的键生效。
命令示例:
config set maxmemory-policy volatile-ttl
原理:随机选择键进行淘汰。
适用场景:内存压力大且数据重要性均等时,快速释放内存。
命令示例:
config set maxmemory-policy volatile-random # 针对带过期时间的键 config set maxmemory-policy allkeys-random # 针对所有键
推荐策略:allkeys-lru 或 allkeys-lfu
理由:优先保留热点数据,最大化缓存命中率。
推荐策略:noeviction(需确保内存足够或启用持久化)。
替代方案:若允许部分数据丢失,可使用 volatile-lru 结合过期时间。
推荐策略:volatile-ttl
理由:自动清理生命周期明确的数据(如验证码、会话信息)。
推荐策略:allkeys-lru + 部分键设置过期时间。
示例:电商系统中,商品详情用 allkeys-lru 缓存,购物车数据设置 ttl。
设置合理的 maxmemory:通常为物理内存的 80%~90%,避免 oom。
监控内存使用:
info memory # 查看内存指标(used_memory、maxmemory) info stats # 查看 evicted_keys(淘汰键数量)
分片设计:通过集群分散数据,减少单个节点的内存压力。
预热缓存:重启后预加载高频数据,避免冷启动时集中淘汰。
volatile-ttl 不依赖惰性删除:该策略仅在内存不足时触发,仍需依赖定期/惰性删除清理过期键。
lfu 计数器并非精确值:访问频率通过概率递增,适用于相对比较而非绝对计数。
redis 的内存淘汰策略是平衡内存使用与性能的关键机制。理解不同策略的原理和适用场景,结合业务需求合理配置,可显著提升系统的稳定性和效率。在高并发场景下,建议通过监控工具(如 redisinsight、prometheus)实时跟踪内存和淘汰指标,动态调整策略和资源配置。
通过本文的深度解析,希望您能掌握 redis 内存淘汰的核心机制,并在实践中灵活运用,构建高效可靠的 redis 服务。
参考资料
redis 官方文档:https://redis.io/docs/reference/eviction/
《redis 设计与实现》——黄健宏
redis 源码解析(evict.c、object.c)
到此这篇关于redis 内存淘汰策略深度解析的文章就介绍到这了,更多相关redis 内存淘汰策略内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论