Redis的过期和淘汰是两回事儿

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的过期和淘汰是两回事儿

       今天整理一下关于 Redis 的过期策略和淘汰机制,这两个东西看着很像,其实不是一回事儿。


过期策略

       我们在使用 Redis 当作缓存时,通常会给 Redis 的 Key 设置一个过期时间,被设置过期时间的 Key 在未过期时可以对其进行读取或更新操作,也可以主动将其删除。当其超过设置的时间后,它将失效。通过它的过期机制,可以完成很多功能,比如计数器复位、token 过期等。


       那么,Redis 对已经过期的数据是进行如何处理,或者说是如何删除呢?在 Redis 中有两种策略来删除过期的 Key,分别是 主动删除 被动删除 两种方式,也有资料称为 定期删除惰性删除


被动删除(惰性删除)

       动删除也被称为惰性删除,是 Redis 中的 Key 已经过期,但是 Redis 不会主动将其删除,当有客户端访问该过期 Key 时,Redis 对其进行检查,发现其过期则将其删除,并返回 null 给客户端。


主动删除(定期删除)

       惰性删除有它的优点,不会浪费太多的系统资源,但是也存在相应的问题,就是已经过期的 Key 如果不再被访问,就不会被删除了,这样会浪费不必要的存储空间。因此 Redis 存在一种主动删除过期 Key 的策略。


       主动删除也被称为定期删除,Redis 会定期扫描已经设置了过期时间的 Key,然后从中删除已经过期的 Key。Redis 默认一秒钟完成 10 次这样的扫描,它大概的流程如下:

  • 从设定了过期的 Key 中随机抽取 20 个 Key 进行过期检测
  • 删除所有已经过期的 Key
  • 如果有本次删除的 Key 超过 25%,那么重复第一步

       如果有大量的 Key 过期,这样的扫描可能会导致线程卡顿,因此每次扫描的时长最长为 25ms。


       以上是 Redis 处理过期 Key 的方案,当 Redis 服务器占用的内存空间超过最大允许内存之后,会触发内存的淘汰策略。


淘汰策略

       内存淘汰策略是指 Redis 使用的内存达到或超过其配置的最大内存时触发的一种保护策略,它根据具体的策略来淘汰一些 Key 使得 Redis 可以继续运行。在 Redis 4.0 之后的版本中,Redis 的内存淘汰策略共有 8 种。

  • noeviction:内存达到配置的最大内存时,不再接受新增 Key 的操作,它是默认配置
  • allkeys-lru:在所有 Key 中,保留最近使用的 Key,删除最近最少使用的 Key
  • allkeys-lfu:在所有 Key 中,保留常用的 Key,删除最不常用的 Key
  • allkeys-random:在所有 Key 中,随机删除一些 Key
  • volatile-lru:在设置了过期时间的 Key 中,删除最近最少使用的 Key
  • volatile-lfu:在设置了过期时间的 Key 中,删除最不常用的 Key
  • volatile-random:在设置了过期时间的 Key 中,随机删除一些 Key
  • volatile-ttl:在设置了过期时间的 Key 中,删除最短剩余生存时间中最不常用的 Key


       从上面的策略中可以看出,大体分为两类,分别是 allkeys 和 volatile 两种。allkeys 是所有的 Key,volatile 是设置了过期时间的 Key。在 allkeys 和 volatile 中使用两个淘汰策略是 LRU 和 LFU,即 最近最少使用(确切的是 近似 LRU 算法) 和 最不常用 两种。


小结

       过期和淘汰是两回事,过期是对设置过期时间的 Key 进行删除的一种机制,而淘汰是当使用内存超过设置最大内存时触发的一种保护机制,虽然它也会删除一些 Key。上面整理的是关于 Redis 的过期和淘汰的知识点,具体应该怎么设置淘汰策略,官网给出了建议。需要了解 LRU 和 LFU 算法也可以在官网得到具体的说明。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
NoSQL Redis
05- Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略:挥发性 LRU、LFU 和 TTL(针对有过期时间的数据),挥发性随机淘汰,以及全库的 LRU、LFU 随机淘汰,用于在内存不足时选择删除。另外,还有不淘汰策略(no-eviction),允许新写入操作报错而非删除数据。
310 1
|
6天前
|
存储 NoSQL Redis
04- Redis的数据过期策略有哪些 ?
Redis的数据过期策略包括**惰性删除**和**定期删除**。惰性删除在取出key时检查是否过期,节省CPU但可能延迟清理。定期删除则每隔一定时间删除一批过期key,通过限制操作频率减少CPU影响。默认每秒扫描10次,随机抽取20个键,若25%已过期则继续检查,最大执行时间25ms。Redis使用这两种策略的结合以平衡内存和CPU使用。
19 1
|
6天前
|
NoSQL Redis 数据库
Redis的过期键是如何处理的?
【4月更文挑战第3天】Redis过期键处理采用被动删除和主动删除策略。被动删除在客户端访问时检查并删除过期键,节省CPU但可能导致键占用内存。主动删除包括定时和周期性删除,确保即使无客户端访问也能及时清理,但可能增加CPU开销。实际操作中,两者结合使用以平衡内存和CPU资源。
13 1
|
6天前
|
存储 NoSQL Redis
【Redis】Redis如何实现key的过期删除
【Redis】Redis如何实现key的过期删除
|
6天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
16 0
|
6天前
|
缓存 监控 NoSQL
Redis的主要内存淘汰策略
【5月更文挑战第15天】Redis内存淘汰策略在内存满时删除旧数据以容纳新数据。策略包括:volatile-lru/LFU/random(针对有过期时间的键),volatile-ttl(淘汰TTL最短的键),allkeys-lru/LFU(淘汰所有键),和allkeys-random。还有noeviction策略,不淘汰任何键,新写入会报错。选择策略应基于应用访问模式、数据重要性和性能需求。可以通过info命令监控缓存命中率调整策略。
15 3
|
6天前
|
存储 NoSQL 算法
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
|
6天前
|
存储 NoSQL Java
熟悉Redis吗,那Redis的过期键删除策略是什么
对于Redis,我们业务开发一般都只关心Redis键值对的查询、修改操作,可能因为懒或者只想能用就行,呵呵。很少关心键值对存储在什么地方、键值对过期了会怎么样、Redis有没什么策略处理过期的键、Redis处理过期键又有什么作用?但这些问题却是Java程序员在Redis上进阶的必备知识,不要埋怨Java要学习的系统知识为什么这么多,因为这些确确实实是进阶的程序员所必须掌握的。我们往下看看~
46 2
熟悉Redis吗,那Redis的过期键删除策略是什么
|
6天前
|
缓存 NoSQL 算法
【Redis系列笔记】内存淘汰及过期删除
Redis是一个内存键值对数据库,所以对于内存的管理尤为重要。Redis内部对于内存的管理主要包含两个方向,过期删除策略和数据淘汰策略。内存淘汰策略指在Redis内存使用达到一定阈值的时候,执行某种策略释放内存空间,以便于接收新的数据。数据过期删除策略是指在数据的有效时间到期后,如何从内存中删除这些数据的规则。
49 0
|
6天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis内存淘汰(内存过期)策略
Redis入门到通关之Redis内存淘汰(内存过期)策略
34 3