返回顶部
首页 > 资讯 > 数据库 >Redis 过期删除策略和内存淘汰机制
  • 191
分享到

Redis 过期删除策略和内存淘汰机制

Redis过期删除策略和内存淘汰机制 2015-02-08 05:02:54 191人浏览 无得
摘要

      Redis 设置过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除): EXPIRE ——将键 key 的生存时间设置为 ttl 秒。 PEXPIRE ——

Redis 过期删除策略和内存淘汰机制

     

Redis 设置过期时间

Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除):
  • EXPIRE ——将键 key 的生存时间设置为 ttl 秒。
  • PEXPIRE ——将键 key 的生存时间设置为 ttl 毫秒。
  • EXPIREAT ——将键 key 的过期时间设置为 timestamp 所指定的秒数时间戳。
  • PEXPIREAT ——将键 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳。
虽然有多种不同单位和不同形式的设置命令,但实际上 EXPIRE 、PEXPIRE 、EXPIREAT 三个命令都是使用 PEXPIREAT 命令来实现的:无论客户端执行的是四个命令中的哪一个,经过转换之后,最终的执行效果都和执行 PEXPIREAT 命令一样。  

 

Redis 计算并返回剩余时间

Redis 提供了两个命令,其中 TTL 命令以秒为单位返回键的剩余生存时间;PTTL 命令则以毫秒为单位返回键的剩余生存时间。TTL 和 PTTL 两个命令都是通过计算键的过期时间和当前时间之间的差来实现的。    

 

Redis 过期字典

redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
  • 过期字典的键是一个指针,这个指针指向键空间的某个键对象(也即是某个数据库键)。
  • 过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的 UNIX 时间戳。
   

 

Redis 过期键的判定

通过过期字典,程序可以用以下步骤检查一个给定键是否过期:
  1. 检查给定键是否存在于过期字典,如果存在,那么取得键的过期时间。
  2. 检查当前 UNIX 时间戳是否大于键的过期时间,如果是的话,那么键已经过期,否则的话,键未过期。
   

 

三种过期键删除策略

定时删除

在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。

优点:

  • 对内存是最友好的。通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用地内存。

缺点:

  • 对 CPU 时间是最不友好的。在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。
  • 创建一个定时器需要用到 Redis 服务器中的时间事件,而当前时间事件的实现方式是无序链表,查找一个事件的时间复杂度为 O(N),这并不能高效地处理大量时间事件。
 

惰性删除

放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。

优点:

  • 对 CPU 时间来说是最友好的。程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何 CPU 时间。

缺点:

  • 对内存是最不友好的。如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行 FLUSHDB),我们甚至可以将这种情况看作是一种内存泄露,无用的垃圾数据占用了大量内存,而服务器却不会自己去释放它们。
 

定期删除

每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

优点:

  • 之前讨论的两种删除策略都有明显的缺陷,定期删除策略是前两种策略的一种整合和折中。
  • 定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
  • 除此以外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。

缺点:

  • 定期删除的难点是确定删除操作执行的时长和频率。
  • 如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将 CPU 时间过多地消耗在删除过期键上面。
  • 如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。
   

 

Redis 的过期删除策略

前面讨论了定时删除、惰性删除和定期删除三种过期键删除策略,Redis 服务器实际使用的是惰性删除和定期删除两种策略。通过配合使用这两种策略,服务器可以很好地在合理使用 CPU 时间和避免浪费内存空间之间取得平衡。  

惰性删除策略的实现

过期键的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有读写数据库的 Redis 命令在执行之前都会调用 expireIfNeeded 函数对输入键进行检查:
  1. 如果输入键已经过期,那么 expireIfNeeded 函数将输入键从数据库中删除。
  2. 如果输入键未过期,那么 expireIfNeeded 函数不做动作。
 

定期删除策略的实现

过期键的定期删除策略由 redis.c/activeExpireCycle 函数实现,每当 Redis 的服务器周期性操作 redis.c/serverCron 函数执行时,activeExpireCycle 函数就会调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的 expires 字典中随机检查一部分键的过期时间,并删除其中的过期键。 Redis 默认每秒进行 10 次过期扫描(Redis 的配置文件里面的 hz 参数配置),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略,步骤如下:
  1. 从过期字典中随机选出 20 个 key。
  2. 删除这 20 个 key 中已经过期的 key。
  3. 如果过期的 key 的比例超过 1/4,那就重复步骤(1)。
同时,为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不会超过 25ms。      

 

Redis 的内存淘汰机制

为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。 当实际内存超出 maxmemory 时,Redis 提供了几种可选策略(maxmemory-policy)来让用户自己决定该如何腾出新的空间以继续提供读写服务。
  • noeviction:不会继续服务写请求(del 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。
  • volatile-lru:尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。
  • volatile-ttl:跟上面几乎一样,不过淘汰的策略不是 LRU,而是比较 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。
  • volatile-random:跟上面几乎一样,不过淘汰的 key 是过期 key 集合中随机的 key。
  • alllkeys-lru:区别于 volatille-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合,这意味着一些没有设置过期时间的 key 也会被淘汰。
  • alllkeys-random:跟上面几乎一样,不过淘汰的 key 是随机的 key。
  volatile-xxx 策略只会针对带过期时间的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。如果你只是拿 Redis 做缓存,那么应该使用 allkeys-xxx 策略,客户端写缓存时不必携带过期时间。如果你还想同时使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,这样可以保留没有设置过期时间的 key,它们是永久的 key,不会被 LRU 算法淘汰。      

 

Redis 的 LRU 算法

  Redis 使用的是一种近似 LRU 算法。之所以不使用 LRU 算法,是因为其需要消耗大量的额外内存,需要对现有的数据结构进行较大的改造。近似 LRU 算法很简单,在现有数据结构的基础上使用随机采样法来淘汰元素,能达到和 LRU 算法非常近似的效果。   当 Redis 执行写操作时,发现内存超出 maxmemory,就会执行一次 LRU 淘汰算法。这个算法也很简单,就是随机采样出 5 个 key(数量可以配置,maxmemory_samples),然后淘汰掉最旧的 key,如果淘汰后内存还是超出 maxmemory,那就继续随机采样淘汰,直到内存低于 maxmemory 为止。 如何采样要看 maxmemory-policy 的设置,如果是 allkeys,就从所有的 key 字典中随机采样,如果是 volatile,就从带过期时间的 key 字典中随机采样。每次采样多少个 key 取决于 maxmemory_samples 的设置,默认为 5。   Redis 3.0 在算法中增加了淘汰池,进一步提升了近似 LRU 算法的效果。淘汰池是一个数组,它的大小是 maxmemory_samples,在每一次淘汰循环中,新的随机得出的 key 列表会和淘汰池中的 key 列表进行融合,淘汰掉最旧的一个 key 之后,保留剩余较旧的 key 列表放入淘汰池中留待下一个循环。            
您可能感兴趣的文档:

--结束END--

本文标题: Redis 过期删除策略和内存淘汰机制

本文链接: https://lsjlt.com/news/8820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis 过期删除策略和内存淘汰机制
          Redis 设置过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除): EXPIRE ——将键 key 的生存时间设置为 ttl 秒。 PEXPIRE ——...
    99+
    2015-02-08
    Redis 过期删除策略和内存淘汰机制
  • Redis过期删除策略与内存淘汰策略
    目录过期删除策略设置Redis中key的过期时间 (单位:秒)常见的三种过期删除策略Redis使用用的过期删除策略Redis的定期删除的流程内存淘汰策略设置Redis最大运行内存Redis 内存淘汰策略有哪些?LRU 算...
    99+
    2024-04-02
  • 浅谈Redis 中的过期删除策略和内存淘汰机制
    目录前言Redis 中 key 的过期删除策略1、定时删除2、惰性删除3、定期删除Redis 中过期删除策略从库是否会脏读主库创建的过期键内存淘汰机制内存淘汰触发的最大内存有哪些内存...
    99+
    2024-04-02
  • Redis中的过期删除策略和内存淘汰机制是什么
    这篇文章主要讲解了“Redis中的过期删除策略和内存淘汰机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis中的过期删除策略和内存淘汰机制是什么”吧!Redis 中 key 的...
    99+
    2023-06-29
  • Redis 的内存淘汰策略和过期删除策略的区别
    目录前言过期删除策略如何设置过期时间?如何判定 key 已过期了?过期删除策略有哪些?Redis 过期删除策略是什么?内存淘汰策略如何设置 Redis 最大运行内存?Redis 内存淘汰策略有哪些?LRU 算法和 LFU...
    99+
    2022-07-04
    Redis 内存淘汰策略 Redis 过期删除策略
  • Redis 的内存淘汰策略和过期删除策略的区别
    目录前言过期删除策略如何设置过期时间?如何判定 key 已过期了?过期删除策略有哪些?Redis 过期删除策略是什么?内存淘汰策略如何设置 Redis 最大运行内存?Redis 内存...
    99+
    2024-04-02
  • Redis的过期策略和内存淘汰策略
    文章前言 提到内存管理,我们就需要考虑Redis的内存过期策略和内存淘汰机制。该文章便从这两方面入手,分享一些在Redis内存方面相关的基础知识。 文章中使用的示例版本为Redis5.0版本。 内存过期策略 内存过期策略主要的...
    99+
    2020-12-25
    Redis的过期策略和内存淘汰策略
  • 浅谈Redis中的内存淘汰策略和过期键删除策略
    目录8种淘汰策略过期键的删除策略总结 redis是我们现在最常用的一个工具,帮助我们建设系统的高可用,高性能。 而且我们都知道redis是一个完全基于内存的工具,这也是redis速...
    99+
    2024-04-02
  • Redis的内存淘汰策略和过期删除策略有什么区别
    本文小编为大家详细介绍“Redis的内存淘汰策略和过期删除策略有什么区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis的内存淘汰策略和过期删除策略有什么区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-02
  • Redis的内存淘汰策略和过期删除策略的区别是什么
    这篇文章主要介绍“Redis的内存淘汰策略和过期删除策略的区别是什么”,在日常操作中,相信很多人在Redis的内存淘汰策略和过期删除策略的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • redis key键过期删除策略及淘汰机制探究
    目录Redis过期删除删除策略淘汰机制redis过期删除 redis的键可以设置过期时间,但是并不是每个键一到过期时间就会立即删除,redis不可能给每个设置过期时间的key上添加一个定时器来监视是否过期,CPU根本承受...
    99+
    2023-11-17
    redis key键过期删除 redis key
  • Redis的过期策略和内存淘汰策略最全总结与分析
    文章前言 提到内存管理,我们就需要考虑Redis的内存过期策略和内存淘汰机制。该文章便从这两方面入手,分享一些在Redis内存方面相关的基础知识。 文章中使用的示例版本为Redis5.0版本。 内存过期策略 内存过期策略主要的作用就是,...
    99+
    2016-07-21
    Redis的过期策略和内存淘汰策略最全总结与分析
  • Redis内存淘汰策略有哪些
    Least Recently Used (LRU):最少使用算法,根据键的最近使用时间来淘汰。 First In First Ou...
    99+
    2024-04-09
    Redis
  • Redis过期键与内存淘汰策略深入分析讲解
    目录一、Redis数据库的组织方式1.1 redisServer结构定义1.2 redisDb 结构定义1.3 redisdb初始化二、过期键2.1 设置键的过期时间2.2 过期键的判定2.3 过期键的删除策略2.3.1...
    99+
    2022-11-28
    Redis过期键 Redis内存淘汰策略
  • 深入理解Redis内存淘汰策略
    目录一、内存回收二、设置内存三、内存淘汰策略四、LRU4.1 LRU算法4.2 redis中的LRU算法五、LFU一、内存回收 长时间不使用的缓存 降低IO性能物理内存不够 很多人了解了Redis的好处之后,于是把任何数...
    99+
    2022-07-05
    Redis内存淘汰
  • redis的内存淘汰策略有哪些
    redis 提供了多项内存淘汰策略,以控制在内存不足情况下数据的处理方式。这些策略包括:noeviction:禁用内存淘汰,确保数据不会丢失。volatile-lru:淘汰最久未使用的已...
    99+
    2024-04-19
    redis 数据丢失
  • Redis中如何使用内存淘汰策略
    Redis中如何使用内存淘汰策略,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Redis配置内存1、通过配置文件配置 通过在R...
    99+
    2024-04-02
  • 关于Redis的内存淘汰策略详解
    目录一、什么是内存淘汰?二、Redis 内存上限三、Redis 内存淘汰策略四、内存淘汰的具体工作步骤五、LRU 算法及在 Redis 中的改进5.1 LRU 算法5.2 Redis 中的 LRU 算法六、LFU一、什么...
    99+
    2023-05-19
    Redis 策略 Redis 内存淘汰
  • redis淘汰策略会删除磁盘上的key吗
    否,redis淘汰策略不会删除磁盘上的key。该策略仅针对内存中的key,以腾出空间给新key,而磁盘上的持久化数据不受影响。 Redis淘汰策略是否会删除磁盘上的Key 否,Redi...
    99+
    2024-04-19
    redis 数据访问
  • redis内存淘汰机制是什么?
    本篇文章主要探讨redis的内存淘汰机制。有一定的参考价值,有需要的朋友可以参考一下,跟随小编一起逐个击破redis内存淘汰机制的疑问吧。Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作