Redis删除过期数据的策略概要

Redis 如何在删除过期数据时,兼顾性能和内存容量?

1、正常思路

1-1、定时删除

定时扫描所有键值对,发现过期数据立即删除。

优点:内存空间清理及时,有垃圾数据立即清除,确保了Redis的可用容量。

缺点:浪费CPU算力,对Redis中的所有数据进行全局遍历是一件危险的事情,应该尽力避免。这种做法会影响Redis的性能(吞吐量)。

1-2、懒惰删除

数据过期后不做任何处理,每次被读取时先判断该数据是否过期,过期即删。

优点:性能优异,不影响Redis的正常操作。

缺点:可能会在内存中堆积大量过期数据,占用存储空间(极端情况:有些数据创建以后再也不会访问了),这实际上相当于内存泄漏。

2、Redis的策略

这是一个基于概率的简单策略,假设抽出的样本能够代表整个Redis存储空间。

  1. Redis使用独立的字典存储设定了过期时间(expire)的数据的key,避免在各种操作时触发全局遍历。
  2. Redis 默认每秒进行 10 次过期扫描,从过期字典中随机选取 100 个 key,删除其中已过期的数据。
  3. 如果上述扫描中发现过期 key 的比例超过 25%,则立即再发动一次扫描;直至比例降低到 25% 以下。
  4. 为保证过期扫描不会阻塞正常请求,CPU时间每秒钟最多占用250ms。

以上的每秒扫描次数,以及每秒最多占用的CPU时间,均受到配置文件 redis.conf 中的 hz 参数影响。

你可能感兴趣的:(Redis删除过期数据的策略概要)