Login
网站首页 > 文章中心 > 其它

Redis之key的淘汰策略_redis八种淘汰策略

作者:小编 更新时间:2023-08-16 10:57:47 浏览量:406人看过

淘汰策略概述

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

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

淘汰策略

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

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

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

根据以往使用惯例:

当你希望某些元素的子集被访问的频率高于其他元素,或者当你不知道怎么选择淘汰策略时,allkeys-lru策略是一个很好的选择;

当你在循环访问redis,且所有的key是被连续扫描时,或者你希望key过期时间均匀分布时,allkeys-random策略是一个很好的选择;

如果你希望基于key不同的TTL时间筛选出哪些key可被淘汰,volatile-ttl策略是一个很好的选择;

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

淘汰策略如何工作

淘汰过程如下:

redis检测缓存阈值限制,如果超过阈值则执行淘汰策略;

执行指令等等;

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

近似LRU算法


maxmemory-samples 5

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

Redis之key的淘汰策略_redis八种淘汰策略

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

浅灰色区域是被淘汰的对象

灰色区域是未被淘汰的对象

绿色区域是新加的对象

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

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

新的LFU模式

要配置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表示:永远不会衰减计数器.

Redis之key的淘汰策略_redis八种淘汰策略

以上就是土嘎嘎小编为大家整理的Redis之key的淘汰策略相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章