Redis怎样触发内存数据的淘汰动作

星敏姑娘_9171

星敏姑娘_9171

2026-03-25

862人浏览

原创

Redis内存淘汰在每次写命令前触发,检查是否超maxmemory,超限则按策略淘汰少量key;读操作不触发,未配maxmemory则不启用淘汰。

redis怎样触发内存数据的淘汰动作

Redis 内存淘汰由什么条件触发

Redis 不是等到内存爆了才开始淘汰,而是在每次执行写命令前,先检查当前内存是否超过 maxmemory 配置值。只要这次写入会让内存超限,就立刻按配置的策略淘汰一部分 key。

  • 淘汰动作只发生在写操作中(如 SET、LPUSH、HSET),读操作(如 GET、HGETALL)完全不触发
  • 如果没配 maxmemory,或者设为 0(Linux 默认行为),则不启用淘汰机制,内存可能无限增长
  • 淘汰不是一次性清空到安全水位,而是每次只淘汰少量 key(默认 5 个),再重试写入;若仍超限,继续淘汰,直到成功或无 key 可删

不同淘汰策略的实际行为差异

maxmemory-policy 决定了“挑谁删”,但每种策略的触发时机和效果差别很大:

  • noeviction:不淘汰,直接返回 (error) OOM command not allowed when used memory > 'maxmemory'. —— 最安全,但业务必须自己兜底
  • allkeys-lru / allkeys-lfu:在所有 key 中选,适合缓存场景,但会误伤长期不用但仍有价值的冷数据
  • volatile-lru / volatile-ttl:只淘汰带过期时间的 key,适合把 Redis 当纯缓存 + 临时状态混合用的场景;但如果大量 key 没设 EXPIRE,就等于“失效策略”
  • volatile-lfu 和 allkeys-random 在低频访问或 key 分布不均时容易出现淘汰抖动(刚写入就被删)

注意:lfu 策略依赖访问计数器,计数器不是实时更新,有衰减周期(默认 1 分钟),所以“最近最不常用”其实是近似值。

为什么设置了 maxmemory 却没看到淘汰日志

Redis 默认不打印淘汰动作的详细日志,只在 info 输出里体现结果:

  • 查看淘汰统计:运行 INFO stats,关注 evicted_keys 字段是否在增长
  • 查看当前内存压力:用 INFO memory,比对 used_memory 和 maxmemory
  • 淘汰不明显,常见原因:
    • 写入速率低,淘汰后内存暂时回落,下一次触发间隔长
    • 使用了 noeviction 或 volatile-* 但大部分 key 没过期时间
    • 客户端收到 OOM 错误却没捕获,误以为“没淘汰”,其实是拒绝写入了

淘汰动作对性能和延迟的影响

淘汰本身不是零成本:

  • 每次淘汰都要扫描候选 key 集合(比如 LRU 要查空闲链表,LFU 要算频率分值),CPU 开销随候选集增大而上升
  • 若策略是 allkeys-lfu 且 key 数量达千万级,单次淘汰可能耗时毫秒级,叠加网络往返,P99 延迟会明显上扬
  • 更隐蔽的问题:淘汰引发的 key 失效,可能让上游服务突然大量回源,造成雪崩——这不是 Redis 的问题,但它是淘汰机制的自然后果

真正难处理的,是 volatile 策略下那些“忘了设过期时间”的 key:它们既占内存又躲过淘汰,时间一长,used_memory 会缓慢爬升,直到某次突发写入直接触顶。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1049

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3380

5

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.23

834

12

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4869

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4435

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8532

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

663

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

8822

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习