Redis内存淘汰策略

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

从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

(2) allkeys-lru

从所有数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

(3) volatile-lfu

从已设置过期时间的数据集中挑选出最不常使用的数据淘汰

(4) allkeys-lfu

从所有数据集中挑选出最不常使用的数据淘汰

(5) volatile-ttl

从已设置过期时间的数据集中挑选出即将过期的数据淘汰

(6) allkeys-ttl

从所有数据集中挑选出挑选出即将过期的数据淘汰

(7) volatile-random

从已设置过期时间的数据集中随机挑选出数据淘汰

(8) allkeys-random

从所有数据集中随机挑选出数据淘汰

(9) no-envicition

禁止驱逐数据,永不淘汰
使用策略规则:
1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用 allkeys-random

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值