Redis过期策略、内存淘汰机制

一、Redis设置过期时间

1)设置过期时间的几种常见的命令

  A、 EXPIRE key seconds -- 设置redis 键key的过期时间为seconds秒
  B、 PEXPIRE key milliseconds -- 设置redis 键key的过期时间为millisecond豪秒
  C、 EXPIREAT key timestamp --设置redis键key的过期时间为timestamp时间戳对应的时间秒
  D、 PEXPIREAT key milliseconds-timestamp -设置redis键key的过期时间为milliseconds-timestamp时间戳对应的时间豪秒
  \color{red}{PS:在redis内部实现,前面三个设置过期时间的命令,最后都会转换成最后一个PEXPIREAT命令来完成。}

2)字符串独有的设置过期时间的命令

    setex key second value

3)清除redis过期时间

   PERSIST key

)4获取redis建的过期时间

 TTL key -- 返回键key的过期时间(单位秒)
 PTTL key -- 返回键key的过期时间(单位毫秒)

二、三种过期策略

定时过期

  含义:在设置key的过期时间的同时,为key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
  优缺点:及时清除过期的key,节约内存空间。但是对CPU消耗高。若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重

惰性过期

  含义:在访问某个key的时候,先判断key是否过期,如果过期了则删除key,返回null。
  优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
  缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

定期过期

  含义:每隔一段时间,从设置了过期时间的键中,随机扫描一点数量的key,清除已经过期了的key。
  优点: 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点定期删除过期key--处理"惰性删除"的缺点
  缺点: 在内存友好方面,不如"定时删除".在CPU时间友好方面,不如"惰性删除"
  难点: 合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)

  \color{red}{结论:}定时删除和和定期删除为主动删除。惰性删除为被动删除。用到的时候才会检查key是否过期,过期就删除返回null。
惰性删除为redis服务器内置策略
定期删除可以通过:
第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大 官方值1 and 500建议设置不能超过100,否则非常消耗CPU)
第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略【触发内存淘汰机制】

1、memcached只是用了惰性删除,而Redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以看做是redis优于memcached的一点)

三、Redis过期策略。

  定期过期通过redis.conf 文件 hz 参数配置,默认情况10 即1秒钟10次,100ms一次。官方给出的参考值是1-500,值越大清理过期key的频率越高,但是对CPU消耗越高。原话是当参数值为100时,对CPU消耗特别高。

四、Redis 内存淘汰机制

  当redis内存空间达到参数maxmemory配置的值时,当新写入key时,触发内存淘汰机制。内存淘汰策略通过maxmemory-policy 参数配置;有以下几种:
  noeviction:当内存空中不足以容纳新写入数据时,redis报错,无法写入数据。
  allkeys-random:当内存空间不足以容纳新写入数据时,redis随机清除某个key。
  allkeys-lru:当内存空间不足以容纳新写入数据时,redis会移除最近最少使用的key (less recently used)。
  volatile-random:当内存空间不足以容纳新写入数据时,redis会从设置了过期时间的key中,随机移除某个key。
  volatile-lru:当内存空间不足以容纳新写入数据时,redis会从设置了过期时间的key中,移除最近最少使用的key。
  volatile-ttl:当内存空间不足以容纳新写入数据时,reids会从设置了过期时间的key中优先移除有更早过期时间的key。
  近似LRU算法, maxmemory-samples 5 默认值5 ,官方给出建议如果10将非常接近LRU算法,但是对CPU消耗高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容