【分布式微服务云原生】《Redis 缓存污染问题全解析及淘汰策略深度探索》

《Redis 缓存污染问题全解析及淘汰策略深度探索》

摘要:本文将深入探讨 Redis 中的缓存污染问题,包括其定义、产生的影响以及解决方法。同时,详细介绍 Redis 支持的多种缓存淘汰策略,帮助读者更好地理解和应用 Redis 缓存,提升系统性能。读者将从本文中获得关于 Redis 缓存优化的实用知识和技巧。

关键词:Redis、缓存污染、缓存淘汰策略、LRU、LFU、noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random、allkeys-lfu

一、缓存污染问题的定义与影响

  1. 定义
    • 缓存污染问题说的是缓存中一些只会被访问一次或者几次的数据,被访问完后,再也不会被访问到,但这部分数据依然留存在缓存中,消耗缓存空间。
  2. 影响
    • 缓存污染会随着数据的持续增加而逐渐显露,随着服务的不断运行,缓存中会存在大量的永远不会再次被访问的数据。
    • 缓存空间是有限的,如果缓存空间满了,再往缓存里写数据时就会有额外开销,影响 Redis 性能。这部分额外开销主要是指写的时候判断淘汰策略,根据淘汰策略去选择要淘汰的数据,然后进行删除操作。

二、解决缓存污染问题的方法

解决缓存污染问题,实际上就是配置缓存淘汰策略,要把不会再被访问的数据筛选出来并删除掉,为后续写入的数据腾空间。

三、Redis 支持的缓存淘汰策略

(一)策略分类

Redis 支持的缓存淘汰策略可以分为两类:

  1. volatile开头的淘汰策略是在设置了过期时间的数据中进行淘汰,共有四种。
  2. allkeys开头的淘汰策略是在所有数据中进行淘汰,共有三种。

(二)具体策略详解

  1. noeviction
    • 该策略是 Redis 的默认策略。在这种策略下,一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。
    • 这种策略不会淘汰数据,所以无法解决缓存污染问题。一般生产环境不建议使用。其他七种规则都会根据自己相应的规则来选择数据进行删除操作。
  2. volatile-random
    • 在设置了过期时间的键值对中,进行随机删除。
    • 因为是随机删除,无法把不再访问的数据筛选出来,所以可能依然会存在缓存污染现象,无法解决缓存污染问题。
  3. volatile-ttl
    • 这种算法在判断淘汰数据时参考的指标比随机删除时多进行一步过期时间的排序。
    • Redis 在筛选需删除的数据时,越早过期的数据越优先被选择。
  4. volatile-lru
    • 会使用 LRU 算法筛选设置了过期时间的键值对。
    • LRU 算法的全称是 Least Recently Used,按照最近最久未被使用的原则来筛选数据。
    • Redis 优化的 LRU 算法实现:Redis 会记录每个数据的最近一次被访问的时间戳。在 Redis 在决定淘汰的数据时,第一次会随机选出 N 个数据,把它们作为一个候选集合。接下来,Redis 会比较这 N 个数据的 lru 字段,把 lru 字段值最小的数据从缓存中淘汰出去。通过随机读取待删除集合,可以让 Redis 不用维护一个巨大的链表,也不用操作链表,进而提升性能。Redis 选出的数据个数 N,通过配置参数 maxmemory-samples 进行配置。个数 N 越大,则候选集合越大,选择到的最久未被使用的就更准确,N 越小,选择到最久未被使用的数据的概率也会随之减小。
  5. volatile-lfu
    • 会使用 LFU 算法选择设置了过期时间的键值对。
    • LFU 算法:LFU 缓存策略是在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用 LFU 策略筛选淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出缓存。如果两个数据的访问次数相同,LFU 策略再比较这两个数据的访问时效性,把距离上一次访问时间更久的数据淘汰出缓存。
    • Redis 的 LFU 算法实现:当 LFU 策略筛选数据时,Redis 会在候选集合中,根据数据 lru 字段的后 8bit 选择访问次数最少的数据进行淘汰。当访问次数相同时,再根据 lru 字段的前 16bit 值大小,选择访问时间最久远的数据进行淘汰。
    • Redis 只使用了 8bit 记录数据的访问次数,而 8bit 记录的最大值是 255,这样在访问快速的情况下,如果每次被访问就将访问次数加一,很快某条数据就达到最大值 255,可能很多数据都是 255,那么退化成 LRU 算法了。所以 Redis 为了解决这个问题,实现了一个更优的计数规则,并可以通过配置项,来控制计数器增加的速度。
      • 参数 lfu-log-factor:用计数器当前的值乘以配置项 lfu_log_factor 再加 1,再取其倒数,得到一个 p 值;然后,把这个 p 值和一个取值范围在(0,1)间的随机数 r 值比大小,只有 p 值大于 r 值时,计数器才加 1。
      • 参数 lfu-decay-time:控制访问次数衰减。LFU 策略会计算当前时间和数据最近一次访问时间的差值,并把这个差值换算成以分钟为单位。然后,LFU 策略再把这个差值除以 lfu_decay_time 值,所得的结果就是数据 counter 要衰减的值。
      • lfu-log-factor设置越大,递增概率越低,lfu-decay-time设置越大,衰减速度会越慢。我们在应用 LFU 策略时,一般可以将 lfu_log_factor 取值为 10。如果业务应用中有短时高频访问的数据的话,建议把 lfu_decay_time 值设置为 1。可以快速衰减访问次数。volatile-lfu 策略是 Redis 4.0 后新增。
  6. allkeys-lru
    • 使用 LRU 算法在所有数据中进行筛选。
    • 具体 LFU 算法跟上述 volatile-lru 中介绍的一致,只是筛选的数据范围是全部缓存。
  7. allkeys-random
    • 从所有键值对中随机选择并删除数据。
    • volatile-random 跟 allkeys-random 算法一样,随机删除就无法解决缓存污染问题。
  8. allkeys-lfu
    • 使用 LFU 算法在所有数据中进行筛选。
    • 具体 LFU 算法跟上述 volatile-lfu 中介绍的一致,只是筛选的数据范围是全部缓存。allkeys-lfu 策略是 Redis 4.0 后新增。

(三)策略对比表格

策略名称淘汰范围淘汰方式能否解决缓存污染问题
noeviction无特定范围不淘汰数据
volatile-random设置了过期时间的数据随机删除可能无法解决
volatile-ttl设置了过期时间的数据按过期时间排序淘汰可能部分解决
volatile-lru设置了过期时间的数据LRU 算法相对较好地解决
volatile-lfu设置了过期时间的数据LFU 算法较好地解决
allkeys-lru所有数据LRU 算法相对较好地解决
allkeys-random所有数据随机删除无法解决
allkeys-lfu所有数据LFU 算法较好地解决

(四)Java 代码示例

以下是使用 Jedis 连接 Redis 并设置缓存淘汰策略为allkeys-lru的示例代码:

import redis.clients.jedis.Jedis;public class RedisExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 设置缓存淘汰策略为 allkeys-lrujedis.configSet("maxmemory-policy", "allkeys-lru");jedis.set("key1", "value1");jedis.set("key2", "value2");System.out.println(jedis.get("key1"));System.out.println(jedis.get("key2"));jedis.close();}
}

(五)LRU 算法流程图

开始
数据访问
数据是否在缓存中
更新最近访问时间
判断缓存是否已满
将数据放入缓存
根据 LRU 算法选择要淘汰的数据
淘汰数据
结束

四、总结与建议

Redis 4.0 之前一共实现了 6 种内存淘汰策略分别是 noeviction、volatile-random、volatile-ttl、volatile-lru、allkeys-lru、allkeys-random,在 4.0 之后,又增加了 2 种策略,分别是 allkeys-lfu,volatile-lfu。建议优先使用 allkeys-lru 策略。使用 allkeys 开头的策略,在所有数据中进行选择,防止客户端因不规范等原因,随意设置的缓存数据,没配置超时时间。还可以利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。

内容详情
缓存污染问题定义缓存中一些只会被访问一次或者几次的数据,被访问完后,再也不会被访问到,但仍留存在缓存中消耗空间。
缓存污染问题影响数据持续增加时,缓存中存在大量不再被访问的数据,影响 Redis 性能。
解决方法配置缓存淘汰策略,筛选并删除不会再被访问的数据。
Redis 淘汰策略分类volatile 开头在设置过期时间的数据中淘汰,allkeys 开头在所有数据中淘汰。
具体淘汰策略noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random、allkeys-lfu。
策略对比不同策略在淘汰范围、淘汰方式和解决缓存污染问题能力上有所不同。
Java 代码示例使用 Jedis 设置缓存淘汰策略为 allkeys-lru。
LRU 算法流程图展示 LRU 算法的数据访问和淘汰流程。
总结与建议优先使用 allkeys-lru 策略,利用 LRU 算法优势提升性能。

嘿,小伙伴们!关于 Redis 的缓存污染问题和淘汰策略就介绍到这里啦。如果你有更好的见解或者经验,欢迎在评论区分享哦!让我们一起把 Redis 用得更溜吧!😉

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

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

相关文章

深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)

目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一,但是作为基准数据集过于简单,在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…

2024软考网络工程师笔记 - 第10章.组网技术

文章目录 交换机基础1️⃣交换机分类2️⃣其他分类方式3️⃣级联和堆叠4️⃣堆叠优劣势5️⃣交换机性能参数 🕑路由器基础1️⃣路由器接口2️⃣交换机路由器管理方式2️⃣交换机路由器管理方式 交换机基础 1️⃣交换机分类 1.根据交换方式分 存储转发式交换(Store…

Hadoop 踩坑汇总

文章目录 一、完整教程二、解决问题问题①: DataNode 没有问题②: 网页打不开 三、大功告成!! 一、完整教程 这个教程比较详细,博主是按照这个来执行的 https://blog.csdn.net/qq_47831505/article/details/123806514…

保姆级VsCode配置C++编译环境

文章目录 一、下载安装VSCODE二、 安装C拓展三、下载配置MinGW-w64四、下载配置CMake五、 配置vscode中的 json文件六、 谨记 在现代开发中,VSCode以其轻量、强大的扩展生态圈,逐渐成为了众多开发者的首选编辑器,尤其是在C开发环境中&#xf…

全光网络架构

目前组网架构 世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。 有线网 无线网 全光网络方案 场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入…

MySQL程序特别酷

这一篇和上一篇有重合的内容,,我决定从头开始再学一下MySQL,和上一篇的区别是写的更细了,以及写这篇的时候Linux已经学完了 下面就是关于MySQL很多程序的介绍: MySQL安装完成通常会包含如下程序: Linux系…

ArcGIS002:软件自定义设置

摘要:本文详细介绍安装arcgis10.2后软件自定义设置内容,包括工具条的启用、扩展模块的启用、如何加载项管理器、快捷键设置、样式管理器的使用以及软件常规设置。 一、工具条的启用 依次点击菜单栏【自定义】->【工具条】,根据工作需求勾…

基于neo4j的医疗图谱问答与展示

找不到好的毕业设计题材?或者对人工智能领域感兴趣却不知道如何下手?这里给大家推荐一款基于Neo4j的医疗图谱问答系统项目,绝对是毕业设计的不二选择。 这个项目依托于医疗领域的知识图谱,为用户提供交流问答系统。它不仅具有知识…

吃透高并发模型与RPC框架,拿下大厂offer!!!

在当前的互联网市场环境下,竞争愈发激烈,内卷现象严重。在这种背景下,「高并发模型和RPC框架已经成为了大型企业面试的重要环节」。你是否曾因为无法回答相关技术问题而感到尴尬?例如,Java岗位的面试中会询问NIO和Reac…

使用JUC包的AtomicXxxFieldUpdater实现更新的原子性

写在前面 本文一起来看下使用JUC包的AtomicXxxxFieldUpdater实现更新的原子性。代码位置如下: 当前有针对int,long,ref三种类型的支持。如果你需要其他类型的支持的话,也可以照葫芦画瓢。 1:例子 1.1:普…

Java项目-基于springboot框架的学习选课系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

MATLAB图像重心计算

图像重心(或质心)计算是计算机视觉和图像处理领域 应用领域广泛:包括医疗,生物,动画,机器人等。 该文章通过灰度转换->二值化->质心计算 以下是代码中涉及的一些数学概念和公式: 灰度转换&#xff1a…

力扣困难题汇总(14道)

题4(困难): 思路: 找两数组中位数,这个看起来简单,顺手反应就是数第(mn)/2个,这个难在要求时间复杂度为log(mn),所以不能这样搞,我的思路是:每次切割长度为较…

Systemd:简介

1号进程 Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 $ ps -u -p 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TI…

R语言机器学习算法实战系列(九)决策树分类算法 (Decision Trees Classifier)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型模型的决策树预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模…

N9042B UXA 信号分析仪

N9042BUXA 信号分析仪 - 2Hz到50GHz - 使用 N9042B UXA X 系列信号分析仪和各种测量应用软件,可以测试 5G、卫星等应用中的毫米波(mmWave)创新设计的真实性能。 N9042B 具有是德科技信号分析仪中较大的分析带宽和较深的动态范围&#xff0c…

【云原生】Kubernetes部署Jenkins静动Slave

Kubernetes部署Jenkins静动Slave 文章目录 Kubernetes部署Jenkins静动Slave文档介绍资源列表基础环境一、Jenkins Kubernetes清单文件二、使用静态Slave2.1、安装Kubernetes插件2.2、添加Agent2.3、使用Slave 三、使用动态Slave3.1、添加凭据3.2、配置动态Slave3.3、配置Jenkin…

基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper+代码——加性注意力(Additive Attention)

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力(Additive Attention) 【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力(Additive Attention) 文章目录…

kubernetes(三)

k8s之持久化存储pv&pvc 存储资源管理 在基于k8s容器云平台上,对存储资源的使用需求通常包括以下几方面: 1.应用配置文件、密钥的管理; 2.应用的数据持久化存储; 3.在不同的应用间共享数据存储; k8s支持Volume类…