Redis 过期键的淘汰策略
1. 定时淘汰
在设置过期时间时,创建一个定时器(timer),定时器在过期时间来临时,立即执行对键的删除策略。
2. 定期淘汰
每隔一段时间对数据库进行检查,删除里面的过期键。至于要删除多少过期键,扫描多少数据库,根据具体的算法而定。
redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。
Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
1.从过期字典中随机 20 个 key;
2.删除这 20 个 key 中已经过期的 key;
3.如果过期的 key 比率超过 1/4,那就重复步骤 1;
redis默认是每隔 100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载。
3. 惰性淘汰
键过期之后不会立即删除,而是当每次需要从键空间中获取到该值时,会去判断该键是否已经过期,如果已经过期,就删除;如果没有过期,就返回该值。
redis内存淘汰策略
两个维度:
数据集:已设置过期时间的数据集(volatile),全部数据集(allkeys)
淘汰策略:lru(最近最少使用)、lfu(最不经常使用)、ttl(过期时间)、random(随机)、no-envicition(永不回收)
因此就会有 2*4 + 1 = 9 种内存淘汰策略
(1) volatile-lru
(2) allkeys-lru
(3) volatile-lfu
(4) allkeys-lfu
(5) volatile-ttl
(6) allkeys-ttl
从所有数据集中挑选出挑选出即将过期的数据淘汰
(7) volatile-random
(8) allkeys-random
从所有数据集中随机挑选出数据淘汰