Redis 过期键删除策略及缓存淘汰策略

Redis作为缓存,对应的key值可以设置expire的过期时间,与此对应的,其也有三种过期键的淘汰删除策略。

一、过期键删除策略

1、定时删除
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时对key进行删除;
优点: 保证内存被尽快释放
缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重,所以基本较少使用。

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

3、定期删除
含义:每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作;
优点:
(1)通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点;
(2)定期删除过期key–处理"惰性删除"的缺点;
缺点:
(1)在内存友好方面,不如"定时删除";
(2)在CPU时间友好方面,不如"惰性删除";
难点: 合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)

二、缓存淘汰策略

对应,可能由于我们过期键的删除策略设置不合理(如惰性删除却有大量的key在很长的一段时间内没有被获取,或者说有大量没有过期的键存在,都可能导致我们redis的内存溢出的现象出现,那么这个时候,如果我们要再往redis中存放数据,就应该有对应的缓存淘汰策略,删除掉某些键。

1、淘汰算法:
(1)LRU算法

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
基本思路:

  • 新数据插入到列表头部;
  • 每当缓存命中(即缓存数据被访问),则将数据移到列表头部;
  • 当列表满的时候,将列表尾部的数据丢弃。

在服务器配置中保存了 lru 计数器 server.lrulock,会定时(redis 定时程序 serverCorn())更新,server.lrulock 的值是根据 server.unixtime 计算出来进行排序的,然后选择最近使用时间最久的数据进行删除。另外,从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。每一次访问数据,会更新对应redisObject.lru。

(2)TTL(time to live)
Redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires。与 LRU 数据淘汰机制类似,TTL 数据淘汰机制中会先从过期时间的表中随机挑选几个键值对,取出其中 ttl 最大的键值对淘汰。同样,TTL淘汰策略并不是面向所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对。

(3)随机算法
在随机淘汰的场景下获取待删除的键值对,随机找hash桶再次hash指定位置的dictEntry即可。

2、删除范围: 针对所有的key值或有设置过期时间的key值

3、六种缓存淘汰策略
(1)noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。
(2)allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
(3)volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
(4)allkeys-random: 所有key通用; 随机删除一部分 key。
(5)volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
(6)volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值