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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
【Redis】Redis如何实现key的过期删除
【Redis】Redis如何实现key的过期删除
|
4月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
4月前
|
缓存 NoSQL Redis
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
|
4月前
|
监控 NoSQL Redis
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
|
5月前
|
存储 监控 NoSQL
Redis中的LRU淘汰策略深入解析
Redis的内存管理关键在于处理数据增长与有限内存的矛盾,LRU策略被广泛用于此。LRU基于“不常访问的数据未来访问可能性小”的假设,淘汰最近最少使用的数据。Redis通过双向链表实现,但并非严格LRU,而是采样算法以平衡性能和精度。用户可通过调整`maxmemory-samples`等参数优化。尽管LRU简单高效,但无法区分数据重要性和访问频率,可能误淘汰重要数据。合理设置参数、结合其他策略、监控调优是优化LRU使用的关键。
114 1
|
6月前
|
存储 NoSQL Java
熟悉Redis吗,那Redis的过期键删除策略是什么
对于Redis,我们业务开发一般都只关心Redis键值对的查询、修改操作,可能因为懒或者只想能用就行,呵呵。很少关心键值对存储在什么地方、键值对过期了会怎么样、Redis有没什么策略处理过期的键、Redis处理过期键又有什么作用?但这些问题却是Java程序员在Redis上进阶的必备知识,不要埋怨Java要学习的系统知识为什么这么多,因为这些确确实实是进阶的程序员所必须掌握的。我们往下看看~
熟悉Redis吗,那Redis的过期键删除策略是什么
|
5月前
|
存储 缓存 JSON
Redis-持久化-淘汰机制-IO策略
Redis-持久化-淘汰机制-IO策略
|
5月前
|
存储 缓存 NoSQL
redis的过期淘汰策略
只能存储 20w 条数据,那肯定要保证redis存储的都是热点数据,即:被频繁访问到的数据;并且要保证Redis的内存能够存放20w数据,要计算出Redis内存的大小。
38 0
|
6月前
|
缓存 监控 NoSQL
Redis的主要内存淘汰策略
【5月更文挑战第15天】Redis内存淘汰策略在内存满时删除旧数据以容纳新数据。策略包括:volatile-lru/LFU/random(针对有过期时间的键),volatile-ttl(淘汰TTL最短的键),allkeys-lru/LFU(淘汰所有键),和allkeys-random。还有noeviction策略,不淘汰任何键,新写入会报错。选择策略应基于应用访问模式、数据重要性和性能需求。可以通过info命令监控缓存命中率调整策略。
77 3
|
6月前
|
存储 NoSQL 算法
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
下一篇
无影云桌面