首页 > redis > redis中过期数据的删除以及对性能的影响
2017
05-25

redis中过期数据的删除以及对性能的影响

过期数据的删除对Redis性能影响

当我们对某些 key 设置了 expire 时,数据到了时间会自动删除。如果一个键过期了,它会在什么时候删除呢?

下面介绍三种删除策略:

定时删除

    在这是键的过期时间的同时,创建一个定时器 Timer,让定时器在键过期时间来临时立即执行对过期键的删除。

惰性删除

    键过期后不管,每次读取该键时,判断该键是否过期,如果过期删除该键返回空。

定期删除

    每隔一段时间对数据库中的过期键进行一次检查。

分析总结

定时删除对内存友好,对 CPU 不友好。如果过期删除的键比较多的时候,删除键这一行为会占用相当一部分 CPU 性能,会对 Redis 的吞吐量造成一定影响。

惰性删除对 CPU 友好,内存不友好。如果很多键过期了,但在将来很长一段时间内没有很多客户端访问该键导致过期键不会被删除,占用大量内存空间。

定期删除是定时删除和惰性删除的一种折中。每隔一段时间执行一次删除过期键的操作,并且限制删除操作执行的时长和频率。具体的操作如下:

  • Redis 会将每一个设置了 expire 的键存储在一个独立的字典中,以后会定时遍历这个字典来删除过期的 key。

  • Redis 默认每秒进行十次(每隔100ms)过期扫描,过期扫描不会扫描所有过期字典中的 key,而是采用了一种简单的贪心策略。从过期字典中随机选择 20 个 key;删除这 20 个 key 中已过期的 key;如果过期 key 比例超过 1/4,那就重复步骤 1。

  • 同时,为了保证在过期扫描期间不会出现过度循环,导致线程卡死,算法还增加了扫描时间上限,默认不会超过 25ms。


问题是:定期删除可能会导致很多过期的key到了时间没有被删除掉,所以除了定时遍历外,它还会使用惰性删除策略来删除过期的 key。


实际上还是有问题的,如果定期删除漏掉了很多key,然后也没有及时去查,也就没有走惰性删除,此时还是会有大量的过期key存在内存里,导致redis内存耗尽,这时候如何处理呢?


答案是:走内存淘汰机制


五种淘汰策略

参数maxmemory_policy控制:

noeviction: 如果缓存数据超过了maxmemory限定值,并且客户端正在执行的命令会导致内存分配,则向客户端返回错误响应.

allkeys-lru: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与LRU算法淘汰.

volatile-lru: 只有超时属性的缓存数据才参与LRU算法淘汰.

allkeys-random: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与淘汰, 但是采用随机淘汰,而不是用LRU算法进行淘汰.

volatile-random: 只有超时属性的缓存数据才参与淘汰,但是采用随机淘汰,而不是用LRU算法进行淘汰.

volatile-ttl: 只有超时属性的缓存数据才参与淘汰. 根据缓存数据的超时TTL进行淘汰,而不是用LRU算法进行淘汰.


因为volatile-lru, volatile-random和volatile-ttl这三个淘汰策略使用的不是全量的缓存数据,有可能无法淘汰出足够的内存空间.

因为将缓存数据设置超时属性占用更多的内存, 因此,当内存压力比较大的时候,需要慎重考虑设置超时属性.




本文》有 0 条评论

留下一个回复