• 技术文章 >数据库 >Redis

    一起聊聊Redis缓存的淘汰策略

    青灯夜游青灯夜游2021-10-27 10:25:30转载194
    Redis 缓存有哪些淘汰策略?本篇文章就来和大家一起聊聊Redis缓存的淘汰策略,介绍缓存策略设置建议,希望对大家有所帮助!

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

    它具备以下的特征:

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

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

    Redis 缓存淘汰策略触发

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

    以下配置均为合法:

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

    redis.conf 配置文件如下

    1.png

    8 种 Redis 缓存策略

    Redis 种的 LRU 与 LFU 算法

    LRU 算法

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

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

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

    maxmemory-samples 5

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

    2.png

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

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

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

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

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

    LFU 算法

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

    如果您认为在 LRU,最近访问过但实际上几乎从未被请求过的项目不会过期,因此风险是驱逐将来有更高机会被请求的密钥。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缓存的淘汰策略的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Redis 缓存 淘汰策略
    上一篇:深入解析Redis中的分布式锁 下一篇:深入浅析Redis中的sentinel故障转移

    相关文章推荐

    • 一文详解Redis中的LRU算法• 深入解析Redis中的Info指令• 带你吃透Redis中的主从复制、Sentinel、集群• 2022年Redis高频面试题分享(附答案分析)• linux下 php怎么安装redis扩展

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网