Redis 如何在删除过期数据时,兼顾性能和内存容量?
1、正常思路
1-1、定时删除
定时扫描所有键值对,发现过期数据立即删除。
优点:内存空间清理及时,有垃圾数据立即清除,确保了Redis的可用容量。
缺点:浪费CPU算力,对Redis中的所有数据进行全局遍历是一件危险的事情,应该尽力避免。这种做法会影响Redis的性能(吞吐量)。
1-2、懒惰删除
数据过期后不做任何处理,每次被读取时先判断该数据是否过期,过期即删。
优点:性能优异,不影响Redis的正常操作。
缺点:可能会在内存中堆积大量过期数据,占用存储空间(极端情况:有些数据创建以后再也不会访问了),这实际上相当于内存泄漏。
2、Redis的策略
这是一个基于概率的简单策略,假设抽出的样本能够代表整个Redis存储空间。
- Redis使用独立的字典存储设定了过期时间(expire)的数据的key,避免在各种操作时触发全局遍历。
- Redis 默认每秒进行 10 次过期扫描,从过期字典中随机选取 100 个 key,删除其中已过期的数据。
- 如果上述扫描中发现过期 key 的比例超过 25%,则立即再发动一次扫描;直至比例降低到 25% 以下。
- 为保证过期扫描不会阻塞正常请求,CPU时间每秒钟最多占用250ms。
以上的每秒扫描次数,以及每秒最多占用的CPU时间,均受到配置文件 redis.conf 中的 hz 参数影响。
网友评论