Redis:Redis键值淘汰策略

文章目录

  • 键值淘汰策略
    • 使用 maxmemory 配置指令
    • 为复制或持久化实例设置 maxmemory
    • 淘汰策略
    • 使用 INFO 命令
    • 近似 LRU 算法
    • LFU 淘汰

键值淘汰策略

Redis 常被用作缓存,以加速对较慢服务器或数据库的读取访问。由于缓存条目是持久存储数据的副本,当缓存内存不足时,淘汰它们通常是安全的(必要时将来可以再次缓存)。

Redis 允许你指定一个淘汰策略,当缓存大小超过设定的内存限制时自动淘汰键。每当客户端运行一个向缓存添加更多数据的新命令时,Redis 会检查内存使用情况。如果超过限制,Redis 会根据选择的淘汰策略淘汰键,直到总内存使用量回到限制以下。

注意,当一个命令向缓存添加大量数据(例如,将一个大集合的交集存储到一个新键中)时,内存可能会暂时大幅度超过限制。

下面的部分解释了如何为缓存配置内存限制,也描述了可用的淘汰策略以及何时使用它们。

使用 maxmemory 配置指令

maxmemory配置指令指定用于缓存数据的最大内存量。你可以在启动时通过redis.conf文件设置maxmemory。例如,要配置 100 兆字节的内存限制,你可以在redis.conf中使用以下指令:

maxmemory 100mb

你也可以使用CONFIG SET在运行时通过redis-cli设置maxmemory

> CONFIG SET maxmemory 100mb

maxmemory设置为零表示你不想限制数据集的内存。这是 64 位系统的默认行为,而 32 位系统使用 3GB 的隐式内存限制。 当缓存大小超过maxmemory设置的限制时,Redis 将强制执行你选择的淘汰策略,以防止缓存进一步增长。

客户端发送写入命令

内存是否超限?

正常写入数据

执行淘汰策略

移除一个或多个键

现在内存是否超限?

为复制或持久化实例设置 maxmemory

如果你正在为服务器使用复制或持久化,Redis 会使用一部分 RAM 作为缓冲区,用于存储等待写入副本或 AOF 文件的更新集。此缓冲区使用的内存不包括在用于判断是否需要淘汰的总内存中。

这是因为淘汰键本身也会生成必须添加到缓冲区的更新。如果更新被计入已用内存,那么在某些情况下,通过淘汰键节省的内存会立即被添加到缓冲区的更新数据消耗掉。这反过来会触发更多的淘汰,产生的反馈循环可能会不必要地从缓存中淘汰许多项目。

如果你正在使用复制或持久化,我们建议你设置maxmemory以留出一点空闲 RAM 来存储缓冲区。注意,对于noeviction策略,这并非必要(有关淘汰策略的更多信息,请参阅下面的部分)。

INFO命令在内存部分返回一个mem_not_counted_for_evict值(你可以使用INFO memory选项仅查看此部分)。这是缓冲区当前使用的内存量。虽然确切数量会有所不同,但你可以使用它来估计在设置maxmemory之前要从总可用 RAM 中减去多少。

下面的示意图展示了在使用复制或 AOF 时,Redis 内存的划分情况,其中“复制缓冲区”不计入maxmemory限制:

70%20%10%Redis 实例内存分布 (启用复制/AOF)maxmemory 限制 (数据集)复制缓冲区 (不计入 maxmemory)其他开销

淘汰策略

使用maxmemory-policy配置指令来选择当达到maxmemory设置的限制时你想要使用的淘汰策略。 以下策略可用:

  • noeviction:不淘汰键,但当你尝试执行缓存新数据的命令时,服务器将返回错误。如果你的数据库使用复制,则此条件仅适用于主数据库。注意,仅读取现有数据的命令仍然正常工作。
  • allkeys-lru:淘汰最近最少使用 (LRU) 的键。
  • allkeys-lfu:淘汰最不经常使用 (LFU) 的键。
  • allkeys-random:随机淘汰键。
  • volatile-lru:淘汰设置了过期字段为 true 的键中最近最少使用的键。
  • volatile-lfu:淘汰设置了过期字段为 true 的键中最不经常使用的键。
  • volatile-random:仅在键设置了过期字段为 true 时随机淘汰键。
  • volatile-ttl:淘汰设置了过期字段为 true 且剩余生存时间 (TTL) 值最短的键。

你应该选择一种适合你的应用程序访问键的方式的淘汰策略:

  • 当你期望有一部分元素的访问频率远高于其他元素时,使用allkeys-lru
    根据帕累托原则,这是一个非常常见的情况,所以如果你没有理由更喜欢其他策略,allkeys-lru是一个很好的默认选项。
  • 当你期望所有键的访问频率大致相等时,使用allkeys-random
    例如,当你的应用程序以重复循环的方式读取数据项时。
  • 如果你的代码可以估算哪些键是淘汰的良好候选者并给它们分配较短的 TTL,请使用volatile-ttl
    另请注意,如果你充分利用了键过期,那么你不太可能遇到缓存内存限制,因为键通常会在需要淘汰之前就过期了。
  • volatile-lruvolatile-random策略主要在你想使用单个 Redis 实例进行缓存和存储一组持久键时有用。
    但是,如果可能的话,你应该考虑在这种情况下运行两个独立的 Redis 实例。

另外请注意,为键设置过期值会消耗内存,所以像allkeys-lru这样的策略更节省内存,因为它不需要过期值就能运行。

是 (纯缓存)

否 (需保留部分键)

是, 符合二八定律

否, 分布均匀

关注访问频率

未设置 TTL

最近最少使用

最不经常使用

开始选择策略

是否所有键都可以被淘汰?

访问模式是否有热点?

淘汰的键是否有 TTL?

allkeys-lru

allkeys-random

allkeys-lfu

volatile-ttl

noeviction

关注时间还是最近访问?

volatile-lru

volatile-lfu

使用 INFO 命令

INFO命令提供了一些有用的数据来检查缓存的性能。特别是,INFO stats部分包括两个重要的条目,keyspace_hits(在缓存中成功找到键的次数)和keyspace_misses(请求了一个键但不在缓存中的次数)。下面的计算给出了从缓存满足的尝试访问的百分比:

keyspace_hits / (keyspace_hits + keyspace_misses) * 100

检查这是否大致符合你对你应用程序的预期(自然,百分比越高表示缓存性能越好)。

注意:
EXISTS命令报告键不存在时,这被计为键空间未命中。

如果命中率低于预期,这可能意味着你没有使用最佳的淘汰策略。例如,如果你相信一小部分“热”数据(可以轻松放入缓存)应该占大约 75% 的访问,你可以合理地预期键空间命中百分比在 75% 左右。如果实际百分比较低,请检查evicted_keys的值(也由INFO stats返回)。高比例的淘汰表明你选择的策略过于频繁地淘汰了错误的键(所以allkeys-lru可能是一个不错的选择)。如果evicted_keys的值很低并且你正在使用键过期,请检查expired_keys以查看有多少键已过期。如果这个数字很高,你可能使用的 TTL 太低,或者你选择了错误的键进行过期,这导致键在应该保留之前就从缓存中消失了。
INFO返回的其他有用信息包括:

  • used_memory_dataset:(内存部分)用于缓存数据的内存量。如果这大于maxmemory,那么差值就是maxmemory被超出的量。
  • current_eviction_exceeded_time:(统计部分)自缓存上次开始超过maxmemory以来的时间。
  • commandstats 部分:除其他事项外,这报告了向服务器发出的每个命令被拒绝的次数。如果你正在使用noevictionvolatile_xxx策略之一,你可以使用它来查找哪些命令被maxmemory限制阻止,以及这种情况发生的频率。

近似 LRU 算法

Redis LRU 算法使用最近最少使用的键的近似值,而不是精确计算它们。它随机抽取少量的键,然后淘汰自上次访问以来时间最长的键。

从 Redis 3.0 开始,该算法还跟踪一个良好的淘汰候选池。这提高了算法的性能,使其成为真正的 LRU 算法的接近近似值。

你可以通过maxmemory-samples配置指令更改每次淘汰前要检查的样本数来调整算法的性能:

maxmemory-samples 5

Redis 不使用真正的 LRU 实现是因为它消耗更多的内存。然而,对于使用 Redis 的应用程序来说,该近似值实际上等同于真正的 LRU。该图比较了 Redis 使用的 LRU 近似值与真正的 LRU。 下面的示意图展示了 Redis LRU 算法如何通过随机采样来寻找淘汰目标,而不是遍历所有键:

Redis 内存

随机抽取

所有键集合

随机抽取 5 个样本

比较访问时间

找出最旧的键

淘汰

LFU 淘汰

从 Redis 4.0 开始,最不经常使用 淘汰模式可用。在某些情况下,此模式可能效果更好(提供更好的命中/未命中率)。在 LFU 模式下,Redis 将尝试跟踪项目的访问频率,因此很少使用的项目被淘汰。这意味着经常使用的键有更高的机会保留在内存中。

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

  • volatile-lfu:在设置了过期的键中使用近似 LFU 进行淘汰。
  • allkeys-lfu:使用近似 LFU 淘汰任何键。

LFU 像 LRU 一样被近似:它使用一个概率计数器,称为 Morris 计数器,仅使用每个对象的几位来估计对象访问频率,并结合一个衰减期,以便计数器随时间减少。在某个时刻,我们不再想将键视为经常访问的,即使它们在过去是这样,以便算法能够适应访问模式的变化。

该信息类似于 LRU(如本文档上一节所解释的)进行采样,以选择淘汰候选者。

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

默认情况下,Redis 配置为:

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

这些应该是合理的值,并且已经过实验测试,但用户可能想要尝试这些配置设置以选择最佳值。

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

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

衰减时间显而易见,它是计数器应该衰减的分钟数,当采样并发现它早于该值时。特殊值 0 意味着:我们永远不会衰减计数器。

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

factor100 hits1000 hits100K hits1M hits10M hits
0104255255255255
11849255255255
101018142255255
10081149143255

所以基本上因子是在更好地区分低访问项目的访问和区分高访问项目访问之间的权衡。更多信息可以在示例redis.conf文件中找到。

下面的图表展示了 LFU 计数器的衰减机制:随着时间推移,如果不被访问,计数器会逐渐减少,从而允许新的“热”数据进入。

T1: 访问 计数器 +10

T2: 访问 计数器 +10

等待... 衰减期

T3: 访问 计数器 +10

T4: 未访问 计数器 -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能合规科技论坛在汉召开,AI赋能企业合规转型 - 速递信息

2026年1月16日下午,由中铠律兜主办的智能合规科技(AI-RegTech)创新与应用论坛在武汉中国光谷科技会展中心成功举办。作为2026 AI新楚商大会的重要组成部分,本次论坛以“构建企业智能合规能力:AI-RegTech的落地路径…

2025中学学习机和初中学习机品牌推荐:优质之选助力高效学习 - 速递信息

艾瑞咨询《2024年教育智能硬件市场与用户洞察报告》显示,初中阶段学习平板、词典笔等硬件应用广泛。本文参考相关资料及该报告,围绕中学学习机品牌推荐、初中学习机品牌推荐,提供以下5家学习机品牌:简单一百、小度…

配环境1天,上线3分钟:我把整个团队的本地环境都扔了

“在我电脑上明明是好的”,这句话我曾说过无数次,也听过无数次。 一个微小的环境差异,就能让整个团队的联调陷入僵局,浪费掉一下午的时间。在又一次因为环境问题导致上线延期后,我意识到,我们必须彻底抛弃这种刀…

2026最新青少年祛痘品牌权威排行榜发布!功效成分双优,持久留香、淡化痘印 - 品牌推荐2026

2026最新青少年祛痘产品推荐!安全有效的青少年肌肤护理方案权威发布,青少年祛痘产品推荐 引言 青春期是人生中一个重要的阶段,但伴随而来的肌肤问题常常困扰着青少年群体。据中国皮肤科协会最新调研数据显示,85%的…

程序员必藏:AI如何重塑我的编程工作方式与效率提升秘籍

这篇文章是一位程序员分享自己从传统编程转向大模型辅助编程的经历。AI提升了代码质量,但初级工程师岗位需求减少;使用AI时面临"隐形认知负载"问题,需要在短时间内处理高密度信息;建议在agent coding时代,通…

手把手教你9款AI论文神器,一键生成毕业职称论文 - 麟书学长

写论文常遇选题、文献、初稿、修改、格式等痛点?9款AI工具可全流程提速。PaperNex能一键生成论文、解析导师意见,适合毕业论文;PaperFine自动做问卷分析、生成图表,适配实证类论文;TXYZ可对话式解读ArXiv文献;豆…

Stirling-PDF+cpolar内网穿透,随时随地处理文件超省心

Stirling-PDF 是一款开源免费的 PDF 处理工具,涵盖合并、拆分、压缩、格式转换、加密解密、添加水印等 20 余项实用功能,适配职场办公人群、学生、家长等各类有 PDF 处理需求的用户,其核心优势在于所有操作均在本地完成,既避免了文…

Matlab手势识别源码+报告Matlab手势识别GUI可以识别图片和视频中的手势(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

Matlab手势识别源码报告Matlab手势识别GUI可以识别图片和视频中的手势【源代码报告】 1.图片或者实时视频 2.图像分割,进行手势区域的分割,得到分割结果的二值图 (基于kmeans分割基于肤色分割) 3.图像去噪,形态学处理,去除小对象4…

tsfm

tsfmhttps://www.cnblogs.com/youtmdyang/p/16172480.html

matlab潮流计算程序➕matpower应用文档➕潮流计算报告 (设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

matlab潮流计算程序➕matpower应用文档➕潮流计算报告 (设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 包含IEEE9、IEEE10、IEEE11、IEEE13、IEEE14、IEEE30、IEEE39、IEEE43、IEEE57、IEEE118、IEEE145、IEEE162、IEEE300节点…

TikTok矩阵运营必备:2026年主流系统排名与核心价值拆解

图片来源:搜狐-KK陪你学跨境前言:在TikTok跨境运营中,矩阵系统的选择直接影响账号安全、运营效率与流量获取效果。基于多维度实测与第三方评估数据,本文梳理2026年TikTok矩阵系统前十榜单,拆解各系统核心功能、适配场景…

口碑好的汽车模型零售企业

《汽车模型哪家好:排名前五专业深度测评》 开篇:定下基调 在汽车模型收藏与爱好者的圈子里,挑选到高品质、有特色的汽车模型是大家共同的追求。本次测评旨在为广大对汽车模型感兴趣的人群,深入剖析市场上的汽车模型产品&#xf…

开源鸿蒙+Flutter:跨端开发的分布式协同与数据互通实践 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

超越提示词工程:上下文架构六大核心组件深度解析

本文深入解读Context Engineering概念,指出仅靠Prompt Engineering不足以构建高质量AI应用。通过六大核心组件——Agents、Query Augmentation、Retrieval、Prompting Techniques、Memory和Tools——构建能够动态调整、拥有记忆并能使用工具的完整AI系统。现代AI开发…

MATLAB车牌识别全套代码报告基于matlab的车牌识别系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

MATLAB车牌识别全套代码报告基于matlab的车牌识别系统(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 包含代码和报告一整套 主要实现功能如下: 1、系统通过以打开文件的形式,选取要识别的车牌的图像,实…

小程序制作平台有哪些?SaaS小程序第三方开发平台哪个好 - 码云数智

告别代码束缚,小程序搭建迈入可视化时代!小程序制作平台让零基础人群、中小商家也能轻松打造专属小程序,拖拽组件即可搭建页面,勾选模块就能激活核心功能,套用行业模板快速优化内容,全程无需专业技术,1-3天即可…

靠谱的汽车模型生产厂家

好的,作为一名资深、客观的测评分析师,我将为您呈现一篇关于汽车模型生产厂家的专业测评排名文章。《【汽车模型】哪家好:专业深度测评与厂家排名》开篇:定下基调在收藏、礼品、影视道具及高端展示领域,汽车模型不仅是…

2026年GEO源码价格行情,源头厂商报价参考 - 源码云科技

2026年GEO源码价格行情,源头厂商报价参考2026年AI获客赛道持续爆发,GEO优化作为核心引流手段,彻底改写了企业营销的流量规则。其中GEO优化源码凭借可定制、高适配的优势,成为渠道商、创业者布局AI搜索营销的核心抓…

基于图卷积神经网络的数据分类预测 Matlab语言(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于图卷积神经网络的数据分类预测 Matlab语言(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 程序已经调试好,数据格式为excel! 1 运行环境要求MATLAB版本为2022b以及以上 2 代码中文注释清晰&#xf…

Day83(9)-F:\硕士阶段\Java\课程资料\7、Redis入门到实战教程\Redis-笔记资料\03-高级篇\资料\redis-demo

黑马点评 分布式缓存 Redis集群Redis持久化(RDB和AOF)配置的redis文件位置 /usr/local/src/redis-6.2.6/redis.conf默认停机的时候执行一次rdb持久化方案 知识点(RDB、AOF、两者混合的工业应用)fork 主进程就是指:…