Redis缓存机制详解(数据淘汰策略、缓存击穿、缓存穿透、缓存雪崩)

Redis缓存机制详解

在这里插入图片描述

Redis 作为一个高效的内存数据库,常用于缓存系统。

其缓存机制有助于提高数据访问速度、减轻后端数据库压力。

在这里插入图片描述

由于 Redis 是基于内存的数据库,内存资源有限,因此需要有合理的数据淘汰策略以管理内存使用。

1. 内存数据淘汰策略

在 Redis 配置文件中(通常是 redis.conf),可以通过 maxmemory-policy 配置来设定具体的淘汰策略。
在这里插入图片描述

常见的策略包括:

在这里插入图片描述

  • volatile-lru: 从设置了过期时间的数据集中,移除最近最少使用的数据。
  • allkeys-lru: 从所有数据集中,移除最近最少使用的数据。
  • volatile-lfu: 从设置了过期时间的数据集中,移除最不常使用的数据。
  • allkeys-lfu: 从所有数据集中,移除最不常使用的数据。
  • volatile-random: 从设置了过期时间的数据集中,随机移除数据。
  • allkeys-random: 从所有数据集中,随机移除数据。
  • volatile-ttl: 从设置了过期时间的数据集中,移除即将过期的数据。
  • noeviction: 不移除任何数据,当内存满时,返回错误。该策略通常不建议使用,因为它可能导致无法写入新数据。
    在这里插入图片描述

2. 数据过期机制

Redis 支持对键设置生存时间(TTL)。当键的生存时间到达之后,Redis 会自动删除该键。

  • EXPIRE key seconds: 设置键在指定秒数后过期。
  • PEXPIRE key milliseconds: 设置键在指定毫秒数后过期。
  • EXPIREAT key timestamp: 设置键在指定的时间戳 (单位为秒) 后过期。
  • PEXPIREAT key milliseconds-timestamp: 设置键在指定的时间戳 (单位为毫秒) 后过期。

TTL keyPTTL key 命令检查键的剩余生存时间。具体命令细节可查看Redis通用命令详解。


3. LRU (Least Recently Used) 缓存实现

在这里插入图片描述

LRU(Least Recently Used,最近最少使用)是一种常见的缓存淘汰策略,用于在缓存空间不足时确定哪些数据应该被移除,以便为新数据腾出空间。

在这里插入图片描述

传统的 LRU 算法要求在每次访问数据时,都更新数据的访问时间,然后在淘汰时选择最久未被访问的数据。

但是Redis 的 LRU 算法并不是严格意义上的 LRU 算法,而是近似的 LRU 算法。

在这里插入图片描述

  • Redis 会定期随机地从数据集中(默认是每秒钟从部分数据集中选择5个键),选择一些键检查是否过期或者需要淘汰。
  • 这种方法相对于每次访问时都更新访问时间,大大减少了对每个数据访问的性能开销。

尽管 LRU 的实现略有不同,但它的核心思想与一般的 LRU 策略是相似的。

在这里插入图片描述

配置
  • maxmemory-policy: 在 Redis 配置文件中设置此参数,可以选择不同的淘汰策略,包括 volatile-lru(对设置了过期时间的数据使用 LRU 策略)、allkeys-lru(对所有数据使用 LRU 策略)等。

  • maxmemory-samples: 这个参数可以设置每次淘汰时从数据集中随机选择的键的个数,默认是 5。可以根据实际情况调整以影响 LRU 的淘汰效果。
    在这里插入图片描述


4. LFU (Least Frequently Used) 缓存实现

在这里插入图片描述
LFU(Least Frequently Used,最不常用),与LRU不同的是,LFU策略基于数据的访问频率进行淘汰,而不是最近访问时间。

  • 高效利用缓存:LFU特别适合那些访问频率有明显差异的数据集,例如一些热点数据被频繁访问,而其他数据较少访问的场景。
  • 防止缓存污染:LFU可以有效防止缓存被短时间内大量访问但长期不再使用的数据占据。

和传统的LFU算法一样,Redis会优先淘汰那些访问频率较低的数据。

LFU策略的核心机制

  1. 访问频率计数器

    • 每个键都有一个访问频率计数器,用于记录该键被访问的次数。
    • 这个计数器并不是简单的增加,而是经过某种衰减处理,以防止频繁访问的键长期占据缓存。
  2. 衰减机制

    • 为了防止计数器无限增长,Redis采用了一种衰减机制,使得访问频率会随着时间的推移而减小。
    • 具体的衰减算法结合了访问时间和访问频率,确保那些历史上曾经被频繁访问但最近很少使用的键也会被适当淘汰。
  3. 近似实现

    • 类似于Redis的LRU实现,LFU策略也采用了一种近似方法来减少性能开销。
    • Redis 并不会在每次访问时精确地更新所有键的访问频率,而是通过采样和概率进行近似估算。
配置
  • maxmemory-policy: 在Redis配置文件中,maxmemory-policy参数可以设置为allkeys-lfuvolatile-lfu:
    • allkeys-lfu: 对所有键使用LFU策略。
    • volatile-lfu: 仅对设置了过期时间的键使用LFU策略。

在这里插入图片描述

  • lfu-log-factor: 这个参数控制访问频率计数器的衰减速率。默认值是10,表示每次访问频率以log(10)的速度增长。值越大,计数器增长越慢,从而更强调近期访问频率。

在这里插入图片描述

  • lfu-decay-time: 这个参数控制频率计数器的衰减时间。默认值是1小时,表示每小时衰减一次。更短的衰减时间意味着频率计数器更快地减小,从而使得缓存更容易淘汰那些不再频繁访问的键。

在这里插入图片描述

LFU 淘汰过程
  1. 访问频率记录:每次访问一个键时,对应的访问频率计数器会根据lfu-log-factor进行更新。
  2. 定期衰减:根据lfu-decay-time,Redis会定期对所有键的访问频率计数器进行衰减。
  3. 选择淘汰键:当需要淘汰键时,Redis会选择那些访问频率最低的键进行淘汰。这些键的选择也可能通过随机采样来完成,以减少性能开销。

5. 缓存穿透、缓存击穿和缓存雪崩

  • 缓存穿透:

    • 通常指缓存和数据库中都没有的数据,但大量请求却涌入,直接打到数据库上,导致数据库压力过大。
    • 用户请求的数据本身不存在(例如恶意攻击请求大量不存在的数据)。
    • 每次请求都会绕过缓存直接查询数据库,缓存不起作用。

在这里插入图片描述
常见解决办法:

  • 缓存空对象
    在这里插入图片描述

  • 使用布隆过滤器
    在这里插入图片描述

  • 缓存击穿:

    • 指的是指缓存中某个热点数据失效(过期)后,瞬时大量请求直接落到数据库,导致数据库压力骤增的现象。
    • 热点数据在缓存中存在,并且有许多请求正在访问该数据。
    • 缓存数据过期了,而这时有大量请求同时到来,所有请求都绕过缓存直接访问数据库。

在这里插入图片描述

常见解决方案:

在这里插入图片描述
在这里插入图片描述

  • 缓存雪崩:
    • 指的是缓存服务器(Redis)集群宕机或者大量缓存集中失效,导致大量请求直接打到数据库上,可能会压垮数据库
    • 同一时刻大量缓存数据同时过期。
    • 缓存服务器宕机或重启,导致缓存不可用。

在这里插入图片描述

常见解决方案:

在这里插入图片描述


Tips:了解更多Redis知识,可以去博主的专栏查看哦~

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

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

相关文章

解决chrome浏览器总是将对站点的http访问改为https的问题

问题:vue项目本地运行出来的地址是http开头的,但在chrome浏览器中无法访问,在Edge浏览器就可以,发现是chrome总是自动将http协议升级为https。 已试过的有效的方法: 一、无痕模式下访问 无痕模式下访问不会将http自…

java基于ssm+jsp 超市进销存管理系统

1前台首页功能模块 宜佰丰超市进销存管理系统,在系统首页可以查看首页、商品信息、新闻资讯、留言反馈、我的、跳转到后台、购物车等内容,如图1所示。 图1前台首页功能界面图 用户注册,在用户注册页面可以填写用户名、密码、姓名、联系电话、…

代码随想录——跳跃游戏(Leecode55)

题目链接 贪心 class Solution {public boolean canJump(int[] nums) {int cover 0;if(nums.length 1){return true;}// 只有一个元素可以达到for(int i 0; i < cover; i){// 在cover内选择跳跃步数cover Math.max(i nums[i],cover);if(cover > nums.length - 1)…

出现 defineProps is a compiler macro and no longer needs to be imported. 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行前端代码的时候,出现如下问题: [@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.[@vue/compiler-sfc] defineEmits is a compiler macro and no longer needs to be impo…

【排序 队列】1585. 检查字符串是否可以通过排序子字符串得到另一个字符串

本文涉及知识点 排序 队列 LeetCode1585. 检查字符串是否可以通过排序子字符串得到另一个字符串 给你两个字符串 s 和 t &#xff0c;请你通过若干次以下操作将字符串 s 转化成字符串 t &#xff1a; 选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。 比方说&a…

LLM大语言模型-AI大模型全面介绍

简介&#xff1a; 大语言模型&#xff08;LLM&#xff09;是深度学习的产物&#xff0c;包含数十亿至数万亿参数&#xff0c;通过大规模数据训练&#xff0c;能处理多种自然语言任务。LLM基于Transformer架构&#xff0c;利用多头注意力机制处理长距离依赖&#xff0c;经过预训…

政策护航新能源:政策红利激发行业活力,助推绿色经济腾飞

随着全球气候变化问题日益严重&#xff0c;新能源行业的发展成为推动绿色经济腾飞的重要引擎。近年来&#xff0c;各国政府纷纷出台政策支持新能源产业&#xff0c;旨在激发行业活力&#xff0c;促进经济可持续发展。本文将从政策红利的角度&#xff0c;探讨新能源行业发展的现…

什么是CMSIS || 标准库与HAL库

一&#xff0c;ARM&#xff08;Cortex Microcontroller Software Interface Standard&#xff09; ARM Cortex™ 微控制器软件接口标准&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是 CortexM 处理器系列的与供应商无关的硬件抽象层。…

仿真模拟--静态浮动路由

目录 静态路由 浮动路由 静态路由 浮动路由

Verilog描述一个带有异步置位和异步清零的D触发器

1 带有异步置位和异步清零的D触发器的真值表&#xff1a; 2 Verilog代码描述 module DFF_SR(CLK, D, Rd, Sd, Q, QN);input CLK, D, Rd, Sd;output Q, QN;reg Q_DFF;always (posedge CLKor negedge Rd or negedge Sd)beginif(!Rd)Q_DFF < 1b0;else if(!Sd)Q_DFF < 1b1;e…

华为 Mate 70 系列曝光:首发鸿蒙系统,共四款机型

目前华为在 HDC 2024 大会上宣布&#xff0c;HaemonyOS NEXT 开启开发者先锋用户 Beta 测试&#xff0c;根据官方时间表来看&#xff0c;HaemonyOS NEXT 将在 8 月启动第一批公开 Beta 测试&#xff0c;第四季度推出第一批正式版以及启动第二批公测。 华为 Mate 70 系列将会与 …

Keil 5编译出现misc.c(90): error: no member named ‘IP‘ in ‘NVIC_Type‘

no member named ‘IP’ in ‘NVIC_Type’ 我们在使用Keil 5编译器的AC6进行代码编译的使用&#xff0c;出现如下的错误&#xff1b; 当前的环境 编译器版本 Keil uVision5&#xff0c;V5.31.0.0&#xff1b; CMSIS-Core 版本V6…1.0&#xff1b; 采用GD32F407VK主芯片&…

微信小程序传统开发登录和云开发登录的区别

1. 传统开发登录流程 1. 用户端调用wx.login从微信服务器获取code; 2. 用户端用wx.request将获取的code传递给后端服务器&#xff1b; 3. 后端服务器将拿到的code传给微信服务器&#xff0c;换取openid和session_key; 4. 后端服务器将获取到的信息返回给用户端&#xff1b…

Nuxt3 的生命周期和钩子函数(一)

title: Nuxt3 的生命周期和钩子函数&#xff08;一&#xff09; date: 2024/6/25 updated: 2024/6/25 author: cmdragon excerpt: 摘要&#xff1a;本文是关于Nuxt3的系列文章之一&#xff0c;主要探讨Nuxt3的生命周期和钩子函数&#xff0c;引导读者深入了解其在前端开发中…

C++ | Leetcode C++题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution { public:int rob(vector<int>& nums) {if (nums.empty()) {return 0;}int size nums.size();if (size 1) {return nums[0];}int first nums[0], second max(nums[0], nums[1]);for (int i 2; i < size; …

革新城市景观:轻空间设计团队呈现“淄博会展中心”

“淄博会展中心”&#xff0c;作为国内最大的气膜会展建筑群&#xff0c;自启用以来已经成为淄博市的亮丽新名片和经济引擎。该会展中心在第二十届中国&#xff08;淄博&#xff09;国际陶瓷博览会上首次亮相&#xff0c;其独特的设计和先进的建筑理念吸引了广泛关注。今天&…

MaxWell实时监控Mysql并把数据写入到Kafka主题中

配置mysql 启用MySQL Binlog MySQL服务器的Binlog默认是未开启的&#xff0c;如需进行同步&#xff0c;需要先进行开启 修改MySQL配置文件/etc/my.cnf sudo vim/etc/my.cof 增加如下配置 注&#xff1a;MySQL Binlog模式 Statement-based&#xff1a;基于语句&#xff0c;…

记录bug导致测试部署出错,但是本地环境启动正常。雪花算法使用中报错。并带有源码分析。

bug出现背景 集群产生的日志要求traceId不重复&#xff0c;使用雪花算法生成traceId 报错形式如下 为什么本地无法复现测试环境的bug 因为bug的出现本身就是概率性的事件 代码如下 public static Long workId Long.parseLong(String.valueOf(NetUtil.getLocalhostStr().ha…

故障诊断 | HO-VMD-TCN河马优化算法优化变分模态分解时间卷积神经网络故障诊断模型

效果一览 文章概述 故障诊断 | HO-VMD-TCN河马优化算法优化变分模态分解时间卷积神经网络故障诊断模型&#xff01;河马优化算法&#xff08;Hippopotamus optimization algorithm&#xff0c;HO&#xff09;由Amiri等人于2024年提出&#xff0c;该算法模拟了河马在河流或池塘中…

21 Shell编程之正则表达式与文本处理器

目录 21.1 正则表达式 21.1.1 正则表达式概述 21.1.2 基础正则表达式 21.1.3 扩展正则表达式 21.2 文本处理器 21.2.1 sed工具 21.2.2 awk工具 21.2.3 sort工具 21.2.4 uniq工具 21.1 正则表达式 21.1.1 正则表达式概述 1.正则表达式概述 正则表达式又称正规表达式、常规表达…