【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略

Redis常见问题总结:

  • Redis常见问题总结
    • Redis缓存预热
    • Redis缓存雪崩
    • Redis缓存击穿
    • Redis缓存穿透
  • Redis 中 key 的过期删除策略
    • 数据删除策略
  • Redis内存淘汰策略
    • 一、Redis对过期数据的处理
      • (一)相关配置
      • (二)内存淘汰流程
      • (三)动态改配置命令
    • 二、内存淘汰策略的种类及特点
      • (一)Redis 4.0以前的策略
      • (二)Redis 4.0以后增加的策略
    • 三、常见的淘汰算法
      • (一)FIFO算法(先进先出)
      • (二)LRU算法(最近最少使用)
      • (三)LFU算法(最不常使用)
      • (四)LRU和LFU的选择
    • 总结

Redis常见问题总结

Redis缓存预热

“宕机”服务器启动后迅速宕机,指的是服务刚上线由于Redis中没有任何数据,导致大量请求访问数据库,主从之间数据吞吐量较大,数据同步操作频度较高。

而缓存预热解决的就是,在系统启动前,提前将相关的数据直接加载到缓存系统。避免用户在请求的时候,先查询数据库,再将数据库的查询到的数据缓存到Redis的问题。用户可以直接查询事先被预热的缓存数据。

解决方案:

  • 准备工作:
    • 日常例行统计数据访问记录,统计访问频度较高的热点数据。
    • 将统计结果中的数据分类,根据级别,Redis优先加载级别较高的热点数据
  • 实施:
    • 使用脚本程序固定触发数据预热过程
    • 如果条件允许,使用CDN(内容分发网络),效果会更好

Redis缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。【这里指的是同一批key的过期时间相同或者Redis服务挂掉】

解决方案:

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

Redis缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击

常见的解决方案有两种:

  • 互斥锁
  • 逻辑过期

互斥锁:

逻辑过期:

Redis缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库

常见两种解决方案:

  • 缓存空对象
  • 布隆过滤器

Redis 中 key 的过期删除策略

数据删除策略

什么是过期数据?

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

  • XX :具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据或被删除的数据或未定义的数据

注意:过期的数据真的删除了吗?不是的

删除策略比对

1. 定时删除 节约内存,无占用 不分时段占用CPU资源,频度高拿时间换空间

2. 惰性删除 内存占用严重延时执行,CPU利用率高拿空间换时间

3. 定期删除 内存定期随机清理每秒花费固定的CPU资源维护内存随机抽查,重点抽查

Redis的过期键的删除策略是指当Redis中的缓存的key过期了,Redis要如何处理。
Redis中提供了三种删除策略:
1.定时删除
当放入数据后,设置一个定时器,当定时器读秒完毕后,将对应的数据从dict中删除。
优点: 内存友好,数据一旦过期就会被删除
缺点: CPU不友好,定时器耗费CPU资源,并且频繁的执行清理操作也会耗费CPU资源。用时间换空间
2.惰性删除
当数据过期的时候,不做任何操作。当访问数据的时候,查看数据是否过期,如果过期返回null,并且将数据从内存中清除。如果没过期,就直接返回数据。
优点: CPU友好,数据等到过期并且被访问的时候,才会删除。
缺点: 内存不友好,会占用大量内存。用空间换时间
3.定期删除
定期删除是定时删除和惰性删除的折中方案。每隔一段时间对redisServer中的所有redisDb的expires依次进行随机抽取检查。
Redis中有一个server.hz定义了每秒钟执行定期删除的次数,每次执行的时间为250ms/server.hz。Redis中会维护一个current_db变量来标志当前检查的数据库。current_db++,当超过数据库的数量的时候,会重新从0开始。
定期检查就是执行一个循环,循环中的每轮操作会从current_db对应的数据库中随机依次取出w个key,查看其是否过期。如果过期就将其删除, 并且记录删除的key的个数。如果过期的key个数大于w25%,就会继续检查当前数据库,当过期的key小于w25%,会继续检查下一个数据库。当执行时间超过规定的最大执行时间的时候,会退出检查。一次检查中可以检查多个数据库,但是最多检查数量是redisServer中的数据库个数,也就是最多只能从当前位置检查一圈。

Redis内存淘汰策略

一、Redis对过期数据的处理

Redis的内存淘汰机制主要是用于在Redis用于缓存的内存不足时,处理需要新写入且需申请额外空间的数据。

(一)相关配置

  1. redis.conf中:
    • 配置maxmemory <bytes>,用于设置Redis的最大内存空间。若不设定该参数,默认无限制,通常会设定为物理内存的四分之三。
    • 配置maxmemory-policy noeviction,用于设置淘汰策略,默认为noeviction

(二)内存淘汰流程

  1. 客户端发起需要申请更多内存的命令(如set)。
  2. Redis检查内存使用情况,若已使用内存大于maxmemory,则根据用户配置的不同淘汰策略来淘汰内存(key),以换取一定的内存。
  3. 若上述步骤均无问题,则该命令执行成功。

(三)动态改配置命令

Redis支持动态改配置,无需重启。

  • 设置最大内存:config set maxmemory 100000
  • 设置淘汰策略:config set maxmemory-policy noeviction

二、内存淘汰策略的种类及特点

(一)Redis 4.0以前的策略

  1. noeviction:当内存使用超过配置时会返回错误,不会驱逐任何键。(默认选项,一般不选用)
  2. allkeys-lru:当内存不足以容纳新写入数据时,在整个键空间中,移除最近最少使用的key。(最常用)
  3. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  4. allkeys-random:当内存不足以容纳新写入数据时,在整个键空间中,随机移除某个key。
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

(二)Redis 4.0以后增加的策略

  1. volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键。
  2. allkeys-lfu:从所有键中驱逐使用频率最少的键。

内存淘汰策略可通过配置文件修改,redis.conf对应的配置项是maxmemory-policy,修改对应的值即可。

三、常见的淘汰算法

(一)FIFO算法(先进先出)

  1. 思想
    • 基于队列的先进先出原则,最先进入的数据会被最先淘汰掉,是最简单、最公平的思想。
  2. 实现
    • 维护一个FIFO队列,按照时间顺序将各数据(已分配页面)链接起来组成队列,并将置换指针指向队列的队首。进行置换时,把置换指针所指的数据(页面)顺次换出,并把新加入的数据插到队尾即可。
  3. 缺点
    • 会导致缺页率增加。随着分配页面的增加,被置换的内存页面往往是被频繁访问的,因此FIFO算法会使一些页面频繁地被替换和重新申请内存,从而导致缺页率增加。由于缺页率会随着分配页面的增加而增加,使得redis的开销也逐渐增加,所以这种算法已不再使用。

(二)LRU算法(最近最少使用)

  1. 思想
    • 最近最少使用的会被优先淘汰。如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。当空间满时,最久没有访问的数据最先被淘汰掉。
  2. 实现
    • 用双向链表(LinkedList)+哈希表(HashMap)实现(链表用来表示位置,哈希表用来存储和查找),在Java里有对应的数据结构LinkedHashMap
  3. 缺点
    • 在需要淘汰时,只是随机选取有限的key进行对比,排除掉访问时间最久的元素,不能选择整个候选元素的最优解,只是局部最优。默认随机选取的key的数目为5,在配置文件redis.conf中由maxmemory_samples属性的值决定,采样数量越大越接近于标准LRU算法,但也会带来性能的消耗。
    • 在Redis 3.0以后增加了LRU淘汰池,进一步提高了与标准LRU算法效果的相似度。淘汰池即维护的一个数组,数组大小等于抽样数量maxmemory_samples,在每一次淘汰时,新随机抽取的key和淘汰池中的key进行合并,然后淘汰掉最旧的key,将剩余较旧的前面5个key放入淘汰池中待下一次循环使用。假如maxmemory_samples = 5,随机抽取5个元素,淘汰池中还有5个元素,相当于变相的maxmemory_samples = 10,所以进一步提高了与LRU算法的相似度。

(三)LFU算法(最不常使用)

  1. 思想
    • 如果一个数据在最近一段时间很少被访问到,那么在将来它被访问的可能性也很小。当空间满时,最小频率访问的数据最先被淘汰。
  2. 实现及问题解决
    • 为每个key维护一个计数器,每次key被访问时,计数器增大,计数器越大,则认为访问越频繁。但存在以下问题:
      • 可能存在某个key在开始一个小时内有100万的访问量,但之后一小时内访问量为0,而在第二个小时内另一个key的访问量达到20万,此时第二个小时内key1会优先于key2被淘汰,尽管key2在该小时内访问量更大。
      • 当新加入的key,由于没有被访问过,初始计数器为0,若此时触发淘汰机制,会把最先添加的key最先淘汰掉。
    • 解决方案:在LFU算法中维护了一个24bit的字段,被分成16 bits与8 bits两部分。第一部分(高16 bits)用来记录计数器的上次缩减时间,时间戳,单位精确到分钟。第二部分(低8 bits)用来记录计数器的当前数值,该数值反映访问频率,而非次数。
    • redis.conf配置文件中,lfu-log-factor用来调整计数器counter的增长速度,lfu-log-factor越大,counter增长越慢。lfu-decay-time是一个以分钟为单位的数值,用来调整counter的缩减速度。

(四)LRU和LFU的选择

需要根据业务权衡到底是选择淘汰最近最少使用(LRU)还是选择最不经常使用(LFU)。总的来说,无论是LRU、LFU、TTL还是Random都是近似算法来实现的,在可靠性和性能上做了一定的平衡。在业务中应主动删除没有价值的数据,或者更新某些key的过期时间等来提高Redis的性能和空间,不能过分依赖于淘汰策略。

LRU算法示意图

总结

Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时需要申请额外空间的数据;过期策略用于处理过期的缓存数据。要根据实际业务场景和需求合理选择内存淘汰策略,并结合主动的数据管理操作来优化Redis的性能和内存使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WSL2-轻量级AI训练场景最佳生产环境

WSL2 只适用于 Win 10 、Win11 在运行 AI 软件、AI 模型训练&#xff0c;Linux 是最佳的操作系统。 在运行各种软件&#xff0c;如&#xff1a;Stable Diffusion Web UI 等&#xff0c;使用 Docker 容器运行也更方便后期的快速复用&#xff0c;同样的 Docker 容器在 Linux 中…

【STM32学习】PWM学习(四),散热风扇的控制,PWM调速调制,

目录 1、基础概念 2、PWM调速风扇功能介绍 2.1风扇功率 2.2、PWM输出流程图 2.3、PWM占空比计算 2.4参数计算 3、配置实现 3.1、添加TIM1功能 3.2、生成代码 3.3、修改代码 1、基础概念 参考&#xff1a;【STM32学习】PWM脉冲宽度调制学习笔记&#xff0c;&#xff…

关于k8s集群高可用性的探究

1. k8s的高可用的核心是什么&#xff1f; 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具&#xff0c;k8s受欢迎的时机 是docker容器受欢迎时&#xff0c;因为太多的docker容器&#xff0c;管理起来是一个大工程 那么刚好k8s是google自己用了十来年…

《向量数据库指南》揭秘:GraphRAG如何重塑知识图谱与RAG的融合之道

嘿,各位向量数据库和AI领域的探索者们,我是你们的老朋友,大禹智库的向量数据库高级研究员王帅旭,也是《向量数据库指南》的作者。今天,咱们来聊聊一个既前沿又实用的话题——GraphRAG,一个通过结合知识图谱来增强检索增强生成(RAG)能力的新方法。如果你对向量数据库和A…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

Axure重要元件三——中继器函数

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器函数 主要内容&#xff1a;Item、Reperter、TargetItem 1、中继器的函数&#xff1a;Item\Reperter\TargetItem Item item&#xff1a;获取…

【重学 MySQL】七十四、揭秘存储过程的强大功能与实战技巧

【重学 MySQL】七十四、揭秘存储过程的强大功能与实战技巧 存储过程简介存储过程的分类存储过程的创建基本语法语法元素分析注意点示例 存储过程的调用基本语法语法元素分析调用示例注意事项 存储过程的强大功能实战技巧示例总结 在 MySQL 的学习过程中&#xff0c;存储过程&am…

如何删除Maven

1.找到Maven安装路径 方法一&#xff1a; 可以直接在文件资源管理器里面选中“此电脑”然后右上角搜“apache-maven”&#xff0c;这个过程可能长达几分钟甚至更久 方法二&#xff1a; 这里推荐一个名叫“Everything”的软件&#xff0c;能够快速的查找到需要的文件 2.找到本…

Vue3中ref和reactive的对比

1. ref 定义 用途: 用于创建基本数据类型或单一值的响应式引用。语法: const myRef ref(initialValue); 特性 返回一个包含 .value 属性的 Proxy 对象。适用于基本数据类型&#xff08;如数字、字符串、布尔值等&#xff09;和单一值。 import { ref } from vue;const co…

C++学习笔记1——引用

引用变量是C新增的一种复合类型。 引用是已定义的变量的别名。如变量a为变量b的应用&#xff0c;则可以交替使用a或者b来表示该变量。引用变量主要用于函数的形参&#xff0c;此时函数使用的是该变量的原始数据而不是变量的副本。其作用有些类似于指针&#xff0c;但在类设计中…

pychar社区版下载

文章目录 第⼀步&#xff1a;下载社区版第二步&#xff1a;安装pycharm社区版第三步&#xff1a;创建项目 第⼀步&#xff1a;下载社区版 下载网址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 第二步&#xff1a;安装pycharm社区版 第三步&#xff1a…

从选题到致谢!50条经典ChatGPT学术指令1天完成1篇论文

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 还在为毕业论文头疼&#xff1f;今天给你分享50条神仙提示词&#xff0c;直接1天搞定整篇论文&#xff01;从选题到致谢&#xff0c;全流程全覆盖。你可能不信&#xff0c;论文还能这么快写完&#xff1f;真…

云渲染与3D视觉效果如何影响珠宝行业!

3D渲染技术在珠宝行业的应用正迅速增长&#xff0c;2023年已带来数亿元收益&#xff0c;预计2024年将继续保持增长态势。珠宝品牌正越来越多地采用3D可视化技术来提升产品展示&#xff0c;以在激烈的市场竞争中占据优势。 云渲染技术不仅提升了渲染效率&#xff0c;还降低了成…

记一次有趣的发现-绕过堡垒机访问限制

前言 在某一次对设备运维管理的时候&#xff0c;发现的某安全大厂堡垒机设备存在绕过访问限制的问题&#xff0c;可以直接以低权限用户访问多个受控系统&#xff0c;此次发现是纯粹好奇心驱使下做的一个小测试压根没用任何工具。因为涉及到了很多设备和个人信息&#xff0c;所以…

项目实战:构建 effet.js 人脸识别交互系统的实战之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀构建 effet.js &#x1f4d2;1. 什么是effet.js&#x1f4dc;2. 为什么需要使用effet.js&#x1f4dd;3. effet.js的功能&#x1f4da;4. 使用…

【国产操作系统】揭秘deepin 23自定义、全盘、高级安装的奥秘,携手探索无限可能,尝鲜之旅,等你来驾驭!

简述 deepin 作为国内最好的个人桌面Linux社区发行版之一&#xff0c;其实受到很多人的关系&#xff0c;对于很多普通用户来说&#xff0c;其很易用&#xff0c;不需要怎么折腾&#xff0c;界面也非常友好。 针对技术型的 Linux 用户&#xff0c;可能对 deepin 的态度就是仁者…

文献分享: 高维ANN算法的综述

文章目录 0. \textbf{0. } 0. 写在前面 0.1. \textbf{0.1. } 0.1. 一些预备知识 0.2. \textbf{0.2. } 0.2. 本文的主要研究 0.3. \textbf{0.3. } 0.3. 本文一些研究限制 1. \textbf{1. } 1. 三大类 ANN \textbf{ANN} ANN算法回顾以及 DPG \textbf{DPG} DPG 1.1. \textbf{1.1. …

基于递推式最小二乘法的PMSM参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 最小二乘法是一种回归估计法&#xff0c;适用于被辨识的参数与系统输出为线性关 系的情况。它是在一定数据量下&#xff0c;基于系统输出误差的平方和最小的准则对参 数进行辨识的方法。此模型通过…

案例分享-优秀蓝色系UI界面赏析

蓝色UI设计界面要提升舒适度&#xff0c;关键在于色彩搭配与对比度。选择柔和的蓝色调作为主色&#xff0c;搭配浅灰或白色作为辅助色&#xff0c;能营造清新、宁静的氛围。同时&#xff0c;确保文字与背景之间有足够的对比度&#xff0c;避免视觉疲劳&#xff0c;提升阅读体验…

CatVTON:AI 虚拟换装的卓越之选

在时尚与科技融合的时代&#xff0c;CatVTON 作为一款创新的 AI 虚拟换装工具&#xff0c;正引领着时尚界的变革。它由中山大学、美图、Pixocial 和鹏城实验室等机构联合开发&#xff0c;以其独特的优势和卓越的性能&#xff0c;为时尚爱好者、电商从业者以及设计师们带来了前所…