ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【Redis】过期键删除策略和内存淘汰策略

2021-12-05 18:04:36  阅读:151  来源: 互联网

标签:策略 删除 过期 Redis 时间 内存 key


Redis 过期键策略和内存淘汰策略

目录

设置Redis键过期时间

Redis有四个不同的命令来设置生存时间(键可以存在多久)或过期时间(键什么时候会被删除)。

EXPIRE <key> <ttl> :表示将键 key 的生存时间设置为 ttl 秒。

PEXPIRE <key> <ttl> :表示将键 key 的生存时间设置为 ttl 毫秒。

EXPIREAT <key> <timestamp> :表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳。

PEXPIREAT <key> <timestamp> :表示将键 key 的生存时间设置为 timestamp 所指定的毫秒数时间戳。

在Redis内部实现中,前面三个设置过期时间的命令都会转换成最后一个PEXPIREAT命令来完成。

 另外补充两个知识点:

  一、移除键的过期时间

  PERSIST :表示将key的过期时间移除。

  二、返回键的剩余生存时间

  TTL :以秒的单位返回键 key 的剩余生存时间。

  PTTL :以毫秒的单位返回键 key 的剩余生存时间。


Redis过期时间的判定

  在Redis内部,每当我们设置一个键的过期时间时,Redis就会将该键带上过期时间存放到一个过期字典中。过期字典的键是一个指针,指向键空间某个键对象,值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间--一个毫秒精度的UNIX时间戳。

当我们查询一个键时,Redis便首先检查该键是否存在过期字典中,如果存在,那就获取其过期时间。然后将过期时间和当前系统时间进行比对,比系统时间大,那就没有过期;反之判定该键过期。

过期键删除策略

定时删除

  在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

  优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。

  缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。


惰性删除

  设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

  优点:对 CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

  缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。甚至可以把这种情况看成是一种内存泄漏。


定期删除

 每隔一段时间,我们就对一些key进行检查,删除里面过期的key。

  优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

  缺点:难以确定删除操作执行的时长和频率。

     如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。

     如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。

     另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。


Redis过期删除策略

Redis的过期删除策略是:惰性删除定期删除 两种策略配合使用。

惰性删除: Redis的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

 定期删除:由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

注意:并不是一次运行就检查所有的库,所有的键,而是随机检查一定数量的键。

通过过期删除策略,对于某些永远使用不到的键,并且多次定期删除也没有选定并删除,那么这些键同样会一直驻留在内存中,又或者在Redis中存入了大量的键,这些操作可能导致Redis内存不够用,这时候就需要Redis的内存淘汰策略了。


内存淘汰策略

设置Redis最大内存

  在配置文件redis.conf 中,可以通过参数 maxmemory 来设定最大内存:

img

不设定该参数默认是无限制的,但是通常会设定其为物理内存的四分之三。


设置内存淘汰方式

 当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmory-policy :

img


有如下几种淘汰方式

  1. noeviction: 不移除任何key,只是返回一个写错误 ,默认选项,一般不会选用。
  2. volatile-lru:利用LRU算法移除设置过过期时间的最近最少使用的key 。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用,不推荐。
  3. allkeys-lru:利用LRU算法移除最近最少使用的key(包括设置过期时间和不设置过期时间的)通常使用该方式
  4. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key,不推荐。
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。依然不推荐。
  6. volatile-ttl : 移除即将过期的key。

参考:

《Redis设计与实现》

标签:策略,删除,过期,Redis,时间,内存,key
来源: https://www.cnblogs.com/CJ-cooper/p/15646307.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有