我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis缓存的淘汰策略是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis缓存的淘汰策略是什么

这篇文章主要讲解了“Redis缓存的淘汰策略是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis缓存的淘汰策略是什么”吧!

Redis缓存的淘汰策略是什么

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。【相关推荐:Redis视频教程】

它具备以下的特征:

  • 基于内存运行,具备高性能的特点

  • 支持分布式,理论上可以无限拓展

  • key-value 存储结构,查询高效

  • 提供多种开发语言 API, 容易和现有的业务系统集成。

通常在业务系统种用作分布式缓存,集中式 Session 存储, 分布式锁等运用场景。

不管是本地缓存还是分布式缓存,为了保证较高性能,都是使用内存来保存数据,由于成本和内存限制,当存储的数据超过缓存容量时,需要对缓存的数据进行剔除。 一般的剔除策略有 FIFO 淘汰最早数据、LRU 剔除最近最少使用、和 LFU 剔除最近使用频率最低的数据几种策略。

Redis 缓存淘汰策略触发

在生产环境中我们是不允许 redis 出现 swap 行为的。所以一般会限制最大的使用内存,redis 提供了配置参数 maxmemory 来规定最大的使用内存。

以下配置均为合法:

maxmemory 1000KB 
maxmemory 100MB 
maxmemory 1GB 
maxmemory 0  # 表示不做限制,一般不会用

redis.conf 配置文件如下

Redis缓存的淘汰策略是什么

8 种 Redis 缓存策略

  • volatile-lru 设定超时时间的数据中,删除最不常用的数据;

  • allkeys-lru 查询所有的key 中最不常使用的数据进行删除,这是应用最广泛的策略;

  • volatile-random 在已经设定了超时的数据中随机删除;

  • allkeys-random 查询所有的 key 之后随机删除;

  • volatile-ttl 查询全部设定超时时间的数据,追后马上排序,将马上将要过期的数据进行删除操作;

  • noeviction (默认) 如果设置为该属性,则不会进行删除操作,如果内存溢出则报错返回;

  • volatile-lfu 从所有配置了过期的时间的键中驱逐使用频率最少的键;

  • allkeys-lfu 从所有键中驱逐使用频率最少的键;

Redis 种的 LRU 与 LFU 算法

LRU 算法

Redis LRU 算法不是一个精确的实现。这意味着 Redis 无法选择最佳的驱逐候选者,即过去访问次数最多的访问。相反,它会尝试运行 LRU 算法的近似值,方法是对少量密钥进行采样,然后逐出采样密钥中最好的(具有最早访问时间)的密钥。

然而,从 Redis 3.0 开始,该算法得到了改进,也可以选择一些好的候选者进行驱逐。这提高了算法的性能,使其能够更接近真实 LRU 算法的行为。

Redis LRU 算法的重要之处在于,您可以通过更改样本数量来调整算法的精度,以检查每次驱逐。此参数由以下配置指令控制:

maxmemory-samples 5

Redis 之所以不使用真正的 LRU 实现,是因为它需要更多的内存。然而,对于使用 Redis 的应用程序,近似值实际上是等效的。下面是Redis使用的LRU近似与真实LRU的对比图。

Redis缓存的淘汰策略是什么

生成上述图表的测试使用给定数量的键填充了 Redis 服务器。从第一个到最后一个访问密钥,因此第一个密钥是使用 LRU 算法驱逐的最佳候选者。后来又添加了 50% 的密钥,以强制驱逐一半的旧密钥。

您可以在图中看到三种点,形成三个不同的带。

  • 浅灰色带是被驱逐的对象。

  • 灰色带是未被驱逐的对象。

  • 绿色带是添加的对象。

在理论上的 LRU 实现中,我们预计在旧密钥中,前半部分将过期。Redis LRU 算法只会在概率上使旧密钥过期。

LRU 只是一个模型,用于预测给定密钥在未来被访问的可能性。此外,如果您的数据访问模式非常类似于幂律,则大多数访问将位于 LRU 近似算法能够很好处理的键集中。

缺点:可能会存在一定时间内大量的冷数数据被访问产生大量的热点数据

LFU 算法

从 Redis 4.0 开始,可以使用新的最不常用驱逐模式。这种模式在某些情况下可能会更好(提供更好的命中率/未命中率),因为使用 LFU Redis 会尝试跟踪项目的访问频率,因此很少使用的项目会被驱逐,而经常使用的项目有更高的机会留在记忆中。

如果您认为在 LRU,最近访问过但实际上几乎从未被请求过的项目不会过期,因此风险是驱逐将来有更高机会被请求的密钥。LFU 没有这个问题,一般应该更好地适应不同的访问模式。

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

  • volatile-lfu 在具有过期集的键中使用近似 LFU 驱逐。

  • allkeys-lfu 使用近似 LFU 驱逐任何密钥。

LFU 类似于 LRU:它使用一个概率计数器,称为莫里斯计数器,以便仅使用每个对象的几位来估计对象访问频率,并结合衰减周期,以便计数器随着时间的推移而减少:在某些时候,我们不再希望将密钥视为经常访问的密钥,即使它们过去是这样,以便算法可以适应访问模式的转变。

这些信息的采样与 LRU 发生的情况类似(如本文档的前一部分所述),以便选择驱逐的候选人。

然而,与 LRU 不同的是,LFU 具有某些可调参数:例如,如果不再访问频繁项,它的排名应该以多快的速度降低?还可以调整 Morris 计数器范围,以便更好地使算法适应特定用例。

默认情况下,Redis 4.0 配置为:

  • 在大约一百万个请求时使计数器饱和。

  • 每一分钟衰减一次计数器。

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

有关如何调整这些参数的说明可以redis.conf在源代码分发的示例文件中找到,但简单地说,它们是:

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

衰减时间是显而易见的,它是计数器应该衰减的分钟数,当采样并发现它比该值更旧时。一个特殊值0意味着:每次扫描时总是衰减计数器,很少有用。

计数器对数因子会改变需要多少次命中才能使频率计数器饱和,这恰好在 0-255 的范围内。系数越高,需要越多的访问以达到最大值。根据下表,系数越低,低访问计数器的分辨率越好:

+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255        |
+--------+------------+------------+------------+------------+------------+

淘汰最近一段时间被访问次数最少的数据,以次数作为参考。

缺点:

1. 最近加入的数据常常容易被剔除,因为其起始方法次数比较少,

2. 如果频率时间度量为 1 个小时,则平均一天每个小时内访问频率 1000 的热点数据可能会被 2个小时的一段时间访问的频率为 1001 的数据剔除掉。可能会出现一些临界值的数据。

缓存策略设置建议

建议:了解Redis 的淘汰策略之后,在平时使用尽量主动设置/更新 key 的 expire 时间主动剔除不活跃的旧数据, 有助于提升查询性能

感谢各位的阅读,以上就是“Redis缓存的淘汰策略是什么”的内容了,经过本文的学习后,相信大家对Redis缓存的淘汰策略是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis缓存的淘汰策略是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis 的 maxmemory 配置以及 缓存淘汰策略

1. maxmemory 相关介绍maxmemory 的作用设置 redis 可用内存的上限。maxmemory 的配置将 maxmemory 设置为零将导致没有内存限制。这是 64 位系统的默认行为,而32位系统使用 3GB 的隐式内存限制。maxmemor
redis 的 maxmemory 配置以及 缓存淘汰策略
2015-05-05

Redis的过期策略和内存淘汰策略

文章前言提到内存管理,我们就需要考虑Redis的内存过期策略和内存淘汰机制。该文章便从这两方面入手,分享一些在Redis内存方面相关的基础知识。文章中使用的示例版本为Redis5.0版本。内存过期策略内存过期策略主要的作用就是,在缓存过期之后,能够及时的将失效
Redis的过期策略和内存淘汰策略
2020-12-25

redis的内存淘汰策略有哪些

redis 提供了多项内存淘汰策略,以控制在内存不足情况下数据的处理方式。这些策略包括:noeviction:禁用内存淘汰,确保数据不会丢失。volatile-lru:淘汰最久未使用的已设置过期时间的键。volatile-ttl:淘汰过期时
redis的内存淘汰策略有哪些
2024-04-19

Redis内存淘汰策略有哪些

Least Recently Used (LRU):最少使用算法,根据键的最近使用时间来淘汰。First In First Out (FIFO):先进先出算法,根据键的插入时间来淘汰。Random:随机算法,随机选择一个键进行淘汰。L
Redis内存淘汰策略有哪些
2024-04-09

深入理解Redis内存淘汰策略

目录一、内存回收二、设置内存三、内存淘OMrIioOBX汰策略四、LRU4.1 LRU算法4.2 redis中的LRU算法五、LFU一、内存回收长时间不使用的缓存降低IO性能物理内存不够很多人了解了Redis的好处之后,于是把任何数据
2022-07-05

关于Redis的内存淘汰策略详解

目录一、什么是内存淘汰?二、Redis 内存上限三、Redis 内存淘汰策略四、内存淘汰的具体工作步骤五、LRU 算法及在 Redis 中的改进5.1 LRU 算法5.2 Redis 中的 LRU 算法六、LFU一、什么是内存淘汰?如果在
2023-05-19

Redis的内存淘汰策略和过期删除策略有什么区别

本文小编为大家详细介绍“Redis的内存淘汰策略和过期删除策略有什么区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis的内存淘汰策略和过期删除策略有什么区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-02

Redis中LRU淘汰策略是怎么工作的

在Redis中,LRU(Least Recently Used,最近最少使用)淘汰策略是一种缓存淘汰算法,它根据键的最近使用时间来决定哪些键应该被淘汰。具体工作原理如下:当一个新键被插入到缓存中时,该键的访问时间会被更新为当前时间。当缓存
Redis中LRU淘汰策略是怎么工作的
2024-05-07

Redis 缓存淘汰策略和事务实现乐观锁详情

目录缓存淘汰策略标题LRU原理标题Redis缓存淘汰策略设置最大缓存淘汰策略Redis事务Redis事务介绍MULTIEXECDISCARDWATCHRedis 不支持事务回滚(为什么呢)Redis乐观锁Redis乐观锁实现秒杀缓存淘汰策略
2022-07-21

编程热搜

目录