Redis为什么会淘汰掉刚刚写入的新数据_深入分析近似LRU算法在小样本下的局部误差问题

小辰小哥_9093

小辰小哥_9093

2026-05-05

918人浏览

原创

redis近似lru在小数据集“乱删”是因为采用随机采样+局部比较(默认5个样本),样本量越小误判越严重;增大maxmemory-samples、改用volatile-lru或allkeys-random可缓解,但本质是算法取舍。

redis为什么会淘汰掉刚刚写入的新数据_深入分析近似lru算法在小样本下的局部误差问题

Redis近似LRU为什么在小数据集里“乱删”

因为Redis根本没用真LRU,它用的是随机采样+局部比较的近似算法,样本量越小,选错“最久未用”的概率越高——不是bug,是设计取舍。

典型现象:maxmemory设为100MB,只存了20个key,却把刚SET进去的key立刻淘汰了,而几个小时没碰的老key还活着。

  • Redis默认每秒做10次淘汰尝试(由hz配置控制),每次随机选5个key(maxmemory-samples默认值)比访问时间
  • 5个里挑出idle最大的那个删掉,不遍历全量key,也不维护全局时间链表
  • 当总key数接近甚至小于5时,“随机5个”就退化成“几乎全量随机”,再叠加时钟精度(毫秒级)和idle更新延迟,新key的idle可能被误判为极大

如何让新写入的数据更大概率活下来

核心思路:压低新key的初始idle值,同时抬高老key的淘汰优先级——但不能关淘汰,否则OOM。

  • 增大maxmemory-samples到10或15(注意:值越大CPU开销越高,尤其在大内存实例上)
  • 避免在写密集场景下用allkeys-lru,改用volatile-lru并给新key统一加短过期时间(如SETEX key 300 value),让淘汰逻辑只在有EXPIRE的key里发生,避开无过期时间的新key
  • 如果业务允许,用allkeys-random替代allkeys-lru——至少“乱删”是真随机,不会系统性针对新key

从INFO输出看懂当前LRU偏差程度

INFO memory里的两个字段直接暴露近似LRU的“失真度”:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • mem_allocator无关,忽略
  • 重点看lru_clock:这是Redis内部的LRU时钟(单位秒,每秒自增),它不等于系统时间,但能反映时钟推进是否稳定
  • 更关键的是evicted_keys和expired_keys的比值:如果evicted_keys远高于expired_keys(比如10:1),说明淘汰压力大且LRU策略正在高频介入,此时小样本误差会被放大

执行INFO memory | grep -E "(lru_clock|evicted_keys|expired_keys)",连续观察几分钟,若lru_clock跳变不规律(如隔几秒才+1),说明hz被压低或主线程卡顿,进一步恶化采样质量。

真正要警惕的不是“删新”,而是冷热混存下的隐性抖动

当缓存里同时存在长期有效的元数据(如用户配置)和临时计算结果(如接口聚合数据),近似LRU会不断在两者间错误置换——不是某次删错了,而是每次采样都在强化这种误判。

  • 不要指望调参彻底解决,这是算法本质决定的
  • 业务层做分离:用不同Redis DB(或不同实例),让volatile-lru专管临时数据,noeviction保底存核心配置
  • 监控keyspace_hits和keyspace_misses的比率突降,往往比淘汰数本身更能提前暴露LRU失准带来的缓存雪崩前兆

近似LRU在万级key以上才接近理想行为,几百个key时,它的“淘汰顺序”基本等价于“随机+轻微时间偏置”,接受这点,比硬调参数更省事。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

5536

4

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

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

2023.11.02

4389

19

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

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

2023.11.14

3935

11

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

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

2024.04.02

7172

6

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

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

2024.04.07

643

6

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

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

2024.04.07

756

6

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

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

2024.04.07

6922

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1076

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习