Redis对过期数据的淘汰策略

 

     redis内存数据数据集大小升到一定大的时候(即内存数据达到maxmemory 设定的值),就会实行数据淘汰策略(回收策略),Redis就会根据用户配置的淘汰策略选出无用的key。

(一)过期数据清理时机

     为了防止一次性清理大量过期Key导致Redis服务受影响,Redis只在空闲时清理过期Key。

     具体Redis逐出过期Key的时机为:

     1)惰性清除访问Key时,会判断Key是否过期,清除过期Key。(耗费的时间最低,但可能导致某些过期的key永远无法被清除。)

     2)定期清除Redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除,之所以只随机抽取一部分key,而不是检查所有的key,是考虑到Redis的性能,如果每次都检查所有的key,就会给 CPU 带来很大的负载。

如果定期删除漏掉了很多过期 key,并且大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题呢? redis 内存淘汰机制。

(二)数据淘汰策略

     一共有六种淘汰策略:

     1) volatile-lru:从设置过期时间(不一定已经过期)的数据集中挑选出最近最少使用的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。

     2.)volatile-ttl:从设置过期时间的数据集中挑选将要过期的数据淘汰,优先删除剩余时间(time to live,TTL) 短的key。

     3) volatile-random:从设置过期时间的数据集中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个key。

     4) allkeys-lru整个数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。

     5) allkeys-random:从数据集中选择任意数据淘汰。

     6) no-enviction禁止驱逐数据,也就是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略

     如果分为热数据与冷数据, 推荐使用 allkeys-lru 策略。 也就是, 其中一部分key经常被读写. 如果不确定具体的业务特征, 那么 allkeys-lru 是一个很好的选择。

     如果需要循环读写所有的key, 或者各个key的访问频率差不多, 可以使用 allkeys-random 策略, 即读写所有元素的概率差不多。

     假如要让 Redis 根据 TTL 来筛选需要删除的key, 请使用 volatile-ttl 策略。

(三)RedisLRU算法和TTL算法的实现

     在Redis中,使用的LRU算法和TTL算法并不是真正意义上的LRU,TTL算法,而是近似的。

     Redis中的LRUTTL算法,都是抽取少量的 key 样本, 然后删除其中访问时间久或离过期时间最近的那个key

     这样的好处是:不用浪费额外的空间来记录数据集中需要被删除的数据,如果完全按照LRU算法或TTL算法,遍历数据集并记录数据集中最近最少使用或离过期时间最近的数据。

 

你可能感兴趣的:(redis)