首页IT科技redis淘汰策略会删除磁盘上的key吗(Redis之key的淘汰策略)

redis淘汰策略会删除磁盘上的key吗(Redis之key的淘汰策略)

时间2025-07-31 07:10:02分类IT科技浏览5379
导读:淘汰策略概述 redis作为缓存使用时,在添加新数据的同时自动清理旧的数据。这种行为在开发者社区众所周知,也是流行的memcached系统的默认行为。...

淘汰策略概述

redis作为缓存使用时                ,在添加新数据的同时自动清理旧的数据                。这种行为在开发者社区众所周知                        ,也是流行的memcached系统的默认行为                        。

redis中使用的LRU淘汰算法是一种近似LRU的算法        。

淘汰策略

针对淘汰策略        ,redis有一下几种配置方案:

1                、noeviction:当触发内存阈值时            ,redis只读不写;

2                        、allkeys-lru:针对所有的key                        ,执行LRU(最近最少使用)策略;

3        、allkeys-lfu:针对所有的key            ,执行LFU(最低频使用)策略;

4            、volatile-lru:针对设置了过期时间的key        ,执行LRU(最近最少使用)策略;

5                        、volatile-lfu:针对设置了过期时间的key                        ,执行LFU(最低频使用)策略;

6            、allkeys-random:针对所有key                ,进行随机淘汰;

7        、volatile-random:针对设置了过期时间的key    ,进行随机淘汰;

8                        、volatile-ttl:针对设置了过期时间的key                        ,淘汰剩余过期时间最短的;

根据应用场景选择合适的淘汰策略是非常重要的                    ,我们可以在程序运行时实时重置淘汰策略,并使用Redis INFO输出来监控缓存未命中和命中的数量                    ,以优化设置            。

根据以往使用惯例:

当你希望某些元素的子集被访问的频率高于其他元素                        ,或者当你不知道怎么选择淘汰策略时    ,allkeys-lru策略是一个很好的选择; 当你在循环访问redis                ,且所有的key是被连续扫描时                        ,或者你希望key过期时间均匀分布时        ,allkeys-random策略是一个很好的选择; 如果你希望基于key不同的TTL时间筛选出哪些key可被淘汰            ,volatile-ttl策略是一个很好的选择;

还有一点是为key设置过期时间会占用内存                        ,因此使用allkeys-lru这样的策略会更节省内存            ,因为在内存压力下不需要对key进行过期设置                        。

淘汰策略如何工作

淘汰过程如下:

客户端执行一条指令        ,需要添加一批数据; redis检测缓存阈值限制                        ,如果超过阈值则执行淘汰策略; 执行指令等等;

因此在redis的使用过程中                ,我们可能不断的超过内存阈值限制    ,然后执行淘汰策略再将内存恢复到阈值之下            。

近似LRU算法

自redis3.0以来                        ,该算法得到了改善                    ,能够抽样大批量的key进行淘汰,使其能够更接近真实LRU算法的行为        。
redis lru算法的重要之处在于可以通过更改样本数量来调整算法的精度                    ,此参数由以下配置指令控制:
maxmemory-samples 5

redis不使用真正的LRU实现的原因是它需要更多的内存                        。然而                        ,对于使用Redis的应用程序    ,近似lru算法实际上是与精确lru算法差不多的                。此图将redis使用的LRU近似值与真实LRU进行了比较    。

用给定数量的key填充了Redis服务器(达到内存阈值)进行测试并生成了上面的图                        。从第一个到最后一个访问key                    。第一个key是使用LRU算法淘汰的最佳候选key。之后再添加50%以上的key                ,以强制淘汰一半的旧key                    。

你可以在图中看到三种点                        ,形成了三个不同的区域:

浅灰色区域是被淘汰的对象 灰色区域是未被淘汰的对象 绿色区域是新加的对象

在理论LRU实现中(theoretical LRU)        ,我们预计旧key集合中的前一半将会被淘汰            ,与之相反                        ,redis lru算法实现中            ,旧key集合中也只是会离散性的淘汰其中某些key                        。

正如您所看到的那样        ,与Redis 2.8相比                        ,Redis 3.0在同样抽样数为5个时做得更好                ,但是大多数最新增加的key仍然被Redis 2.8保留    。在Redis 3.0中使用10的样本大小    ,近似值非常接近Redis 3.0的理论性能                。

在模拟中                        ,我们发现使用幂律访问模式(类似20%的key承担了80%的访问)                    ,真实LRU和Redis近似LRU之间的差异极小或根本不存在                        。

使用CONFIG SET maxmemory samples<count>命令在生产中使用不同的样本大小值进行实验非常简单        。

新的LFU模式

从redis4.0开始,可以在某些特定场景下使用低频淘汰策略            。在选用LFU策略后                    ,redis会跟踪key的访问频率                        ,所以低频的key将被淘汰                        。这意味着经常访问的key有很大的机会一直留在内存中            。

要配置LFU模式    ,可以使用以下策略:

volatile-lfu:针对设置了过期时间的key                ,使用近似lfu淘汰; allkeys-lfu:针对所有key                        ,使用近似lfu淘汰;

LFU近似于LRU:它使用一个称为Morris的概率计数器来估计key访问频率        ,计数器中每个key只占用几个bit            ,并且计数器功能附加衰减周期                        ,这样计数器统计的key访问频率就会随着时间的推移而降低(如果一段时间内一个key访问频率低于计数器衰减速度            ,最终这个key会被淘汰)        。直至某一刻        ,我们不再将一些key视为频繁访问的key                        ,即使它们在过去是被频繁访问的                ,以便算法能够适应访问模式的变化                        。

该信息的采样方式与LRU(如本文档前一节所述)选择淘汰key的情况类似                。

然而    ,与LRU不同的是                        ,LFU具有某些可调参数:例如                    ,如果一个频繁key不再被访问,那么它的访问频率级别应该降低多少?还可以调整Morris计数器范围                    ,以更好地使算法适应特定的场景    。

默认情况下                        ,Redis配置为:

在大约100万次请求时让计数器饱和; 每一分钟使计数器衰减一次;

这些配置应该是合理的    ,并且经过了实验测试                ,但用户可能希望使用这些配置设置来选择最佳值                        。

有关如何调整这些参数的说明                        ,可以在源发行版的示例redis.conf文件中找到                    。简而言之        ,它们是:

lfu-log-factor 10 lfu-decay-time 1

衰减时间是最明显的一个            ,它是计数器在采样时应该衰减的分钟数。特殊值0表示:永远不会衰减计数器                    。

计数器对数因子决定了使频率计数器达到饱和需要的key命中次数                        ,频率计数器刚好在0-255范围内                        。系数越高            ,需要更多的访问才能达到最大值;系数越低        ,低频访问计数器的分辨率越好                        ,如下表所示:

声明:本站所有文章                ,如无特殊说明或标注    ,均为本站原创发布    。任何个人或组织                        ,在未征得本站同意时                    ,禁止复制                、盗用    、采集                        、发布本站内容到任何网站                    、书籍等各类媒体平台                。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理                        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
许岑老师可以做哪些教程赚钱-美貌大王许岑的挣钱史 | 正午 哪些软件是真的能赚钱提现的(哪些app可以赚钱提现-骗局曝光!”走路就能赚钱”APP终于栽了!)