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自…

Tkinter PyQt或PySide、Kivy 的区别

选择Python GUI框架时,最好的选择取决于你的具体需求、项目类型以及你对外观和用户体验的期望。这里是一些常用的Python GUI框架,以及它们的优势和劣势: 1. Tkinter 优势: 内置于Python标准库中,无需安装额外的包即可…

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)…

数据库开发规范

一、引言 数据库开发规范是确保数据库系统稳定性、安全性、可维护性和性能的重要指导原则。本规范旨在明确数据库开发过程中的各项标准&#xff0c;包括命名规范、设计规范、编码规范、安全规范以及性能优化等方面&#xff0c;以指导开发人员和数据库管理员进行高效的数据库开…

出现 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…

Makefile中strip函数的用法

在Makefile中&#xff0c;strip 函数的作用是去除变量值两端的空白字符&#xff08;空格和制表符&#xff09;。它的基本语法如下&#xff1a; stripped : $(strip variable)其中&#xff0c;variable 是要去除空白字符的变量名或表达式。strip 函数通常用于确保变量的值不包含…

Scikit-learn中的Fit方法:机器学习模型的灵魂

Scikit-learn中的Fit方法&#xff1a;机器学习模型的灵魂 在机器学习的世界里&#xff0c;Scikit-learn&#xff08;简称sklearn&#xff09;是一个广受欢迎的Python库&#xff0c;以其简洁、高效而著称。而在这个库中&#xff0c;fit方法扮演了一个至关重要的角色。本文将深入…

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 处理器系列的与供应商无关的硬件抽象层。…

docker的安装配置及使用

一.Docker的由来 Docker 最初是 dotCloud 公司创始人Solomon Hykes 在法国期间发起的一个公司内部项目。 2010年的专门做PAAS平台&#xff0c;但是到了2013年的时候&#xff0c;像亚马逊&#xff0c;微软&#xff0c;Google都开始做PAAS平台。 到了2013年&#xff0c;公司资金链…

空调器的铜管

1)、 全新开发的空调器&#xff0c;在钣金、塑料件结构方案设计的同时&#xff0c;进行配管结构设计,充分考虑整体空间的合理分配&#xff0c;以避免配管设计在其它结构方案确定之后&#xff0c;只局限在有限的空间内进行。 2)、 制冷系统以外的结构件已定型的产品&#xff0c…

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

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

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…

使用 C# 和 OpenXML 读取大型 Excel 文件

介绍 高效读取大型 Excel 文件可能具有挑战性&#xff0c;尤其是在处理需要高性能和可扩展性的应用程序时。Microsoft 的 OpenXML SDK 提供了一套强大的工具来处理 Office 文档&#xff08;包括 Excel 文件&#xff09;&#xff0c;而无需在服务器上安装 Excel。本文将指导您使…

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

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

(深度学习记录)第TR6周:Transformer实战-单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f3e1;我的环境&#xff1a; 语言环境&#xff1a;Python3.11.4编译器&#xff1a;Jupyter Notebooktorcch版本&#xff1a;2.0.…

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主芯片&…