AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题
目录
一、三种删除策略比较
二、缓存雪崩+缓存击穿+缓存穿透
三、缓存一致性
Redis学习笔记
一、三种删除策略比较
内存占用 | CPU占用 | 特征 | |
---|---|---|---|
定时删除 | 节约内存,无占用 | 不分时段占用CPU资源,频度高 | 时间换空间 |
惰性删除 | 内存占用严重 | 延时执行,CPU利用率高 | 空间换时间 |
定期删除 | 内存定期随机清理 | 每秒花费固定的CPU资源维护内存 | 随机抽查,重点抽查 |
1.定时删除:创建一个定时器,当key过期时,定时器立即删除过期数据。这样做节约内存,但是cpu负荷高,由于redis时单线程的,在访问量大时,甚至会引起线程阻塞。
2.惰性删除: 数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据。如果已过期,删除,返回不存在。这样CPU压力会降低,但是内存压力很大,长期有过期数据占用内存。
3.定期删除:这种策略平衡了前两种极端的方案,Redis启动服务器初始化时,读取配置server.hz的值,默认为10.每秒执行server.hz次的serverCron()中的方法,周期性的轮询redis库中的时效型数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度(过期数据的比例不超过25%)。
定期删除的优点在于CPU性能占用设置有峰值,检测频度可自定义,内存压力和CPU压力都不大。但是仅仅是通过给key设置时长还是有问题的,因为还是有很多过期key堆积在内存中,容易引起Out Of Memory。那么如何解决这方面的问题呢?就是Redis的内存淘汰机制(逐出算法)。
Redis使用内存存储数据,在执行没一个命令前,会调用FreeMemoryIFNeeded()检查内存是否充足,如果内存不满足新加入数据的最低存储要求,redis要删除一些数据为清理空间。清理的策略被称为逐出算法:
Redis目前有8种逐出策略:
1.volatile-lru:从已设置过期时间的数据中,挑选最近最少使用的数据淘汰。(针对时间)
2.volatile-lfu:从已设置过期时间的数据中,挑选最近使用次数最少的数据淘汰。(针对访问频率)
3.volatile-ttl:从已设置过期时间的数据中,挑选快要过期的数据。
4.volatile-random:从已设置过期时间的数据中,任意选择数据淘汰。
5.allkeys-lru:在所有的key中,移除最近最少使用的key。
6.allkeys-lfu:在所有的key中,移除最近使用次数最少的key。
7.allkeys-random:任意挑选数据淘汰。
8.no-eviction:禁止驱逐数据(Redis4.0默认策略)。
需要注意的时,逐出过程并不是100%的能够清理出足够的空间,如果不成功反复执行,在所有数据都尝试完毕后,如果还是不能满足内存清理的要求,将会出现错误信息。
(error) OOM command not allowed when used memory >'maxmemory'
二、缓存雪崩+缓存击穿+缓存穿透
缓存预热:在系统启动前,提交将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候,先查数据库,然后再缓存数据的问题,
缓存雪崩:大面积key同一时间失效,所有请求直接落在数据库上,造成数据库压力过大,可能导致服务器宕机。
解决方案:1.更多的页面静态化处理;
2.构造多级缓存
3.灾难预警机制
4.限流,降级(短时间牺牲客户体验,限制一部分请求,降低服务器压力,待业务低速运转后,再逐步放开)
5.删除策略进行切换(lru->lfu)
6.数据分类,有效期策略调整(稀释集中到期的key的数量)
7.超热数据 永久key
缓存击穿:某个热点key过期,大量请求落在服务器。
解决方案:1.二级缓存
2.设置永久key
3.延长过期时间,待访问量降低后移除
缓存穿透:redis出现大面积未命中(请求的key不在redis中,直接落在服务器)
解决方案:1.布隆过滤器
2.缓存null
3.做好参数校验
4.实时监控(redis的命中率)
5.key加密(不满足直接驳回)
三、缓存一致性
缓存数据同步的常见方式有三种:
- 设置有效期:给缓存设置有效期,到期后自动删除。再次查询时更新
- 优势:简单、方便
- 缺点:时效性差,缓存过期之前可能不一致
- 场景:更新频率较低,时效性要求低的业务
- 延时双删:在修改数据库的同时,直接修改缓存
- 优势:时效性强,缓存与数据库强一致
- 缺点:有代码侵入,耦合度高;
- 场景:对一致性、时效性要求较高的缓存数据
- 异步通知(MQ或监听bin log):修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
- 优势:低耦合,可以同时通知多个缓存服务
- 缺点:时效性一般,可能存在中间不一致状态
- 场景:时效性要求一般,有多个服务需要同步
相关文章:
AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题
目录 一、三种删除策略比较 二、缓存雪崩缓存击穿缓存穿透 三、缓存一致性 Redis学习笔记 一、三种删除策略比较 内存占用CPU占用特征定时删除节约内存,无占用不分时段占用CPU资源,频度高时间换空间惰性删除内存占用严重延时执行,CPU利用…...

成都跃享未来教育咨询有限公司抖音小店:引领教育咨询新风尚
在数字化浪潮席卷全球的今天,教育咨询行业正经历着前所未有的变革。成都跃享未来教育咨询有限公司,作为教育行业的一颗璀璨新星,凭借其前瞻性的教育理念与创新的运营模式,在抖音平台上开设了小店,不仅为广大学子及家长…...
【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?
文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好,是因为使用向上调整法建堆的时间复杂…...

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法
SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …...

使用ffmpeg合并视频和音频
使用ffmpeg合并视频和音频 - 哔哩哔哩 简介 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec࿰…...
周末总结(2024/10/05)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
在Ubuntu中自动挂载SMB/CIFS共享
文章目录 0. 引言1. 使用credentials文件存储认证信息2. 挂载点的准备3. 必要软件的安装4. 调整挂载参数5. 测试挂载6. 日志调试 0. 引言 本文是自己挂载共享磁盘的实践记录,将详细介绍如何在Linux系统中配置自动挂载SMB/CIFS共享,并提供一些常见问题的…...

pWnOS2.0 靶机渗透( cms 渗透,php+mysql 网站渗透,密码碰撞)
pWnOS2.0 靶机渗透( ) 靶机介绍 vulnhub 靶机 本地搭建 由于靶机特性,靶机网卡位nat模式扫不到,原来需要改 nat 的地址 参考方法 https://blog.csdn.net/Bossfrank/article/details/131415257 作者主页 https://blog.csdn.net/Bossfrank?typeblog P…...

【AI】AIOT简介
随着技术的快速发展,人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合,使物联网设备更加智能化,能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…...

picgo + typora + gitee图床
Picgo打造个人图床,稳定又安全 解决Typora笔记上传到CSDN图片无法显示的问题 typora中...

【路径规划】多机器人路径规划
摘要 多机器人路径规划在现代自动化、仓储管理及智能交通系统中有着广泛的应用。本文提出了一种基于A*算法的多机器人路径规划方法,旨在解决多机器人在同一环境中的路径冲突问题。通过采用启发式搜索和路径优化策略,机器人能够在保持避障的前提下实现最…...
深度学习Day-35:One-hot独热编码
🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客 🍖 原作者:[K同学啊 | 接辅导、项目定制] 一、 独热编码原理 独热编码(One-Hot Encoding)是一种将分类数据转换为二进制向量的方法&#…...
Streamlit 实现登录注册验证
在开发基于 Streamlit 的应用时,用户认证功能是一个常见需求。本文将介绍如何通过两种方式来实现登录注册功能:手动实现 和 使用 Streamlit-Authenticator 库。手动实现虽然灵活,但需要自行处理密码加密、验证等细节;而 Streamlit…...

ASP.NET Zero 多租户介绍
ASP.NET Zero 是一个基于 ASP.NET Core 的应用程序框架,它提供了多租户支持,以下是关于 ASP.NET Zero 多租户的介绍: 一、多租户概念 多租户是一种软件架构模式,允许多个客户(租户)共享同一套软件应用程序…...
【60天备战2024年11月软考高级系统架构设计师——第29天:微服务架构——微服务的优缺点】
微服务架构通过将大型单体应用拆分为多个独立的小型服务,使系统具备灵活性、可扩展性和独立部署的优势。但与此相伴的是复杂的运维和开发管理挑战。因此,在选择微服务架构时,架构师需仔细权衡其优势与劣势。 微服务架构的优点 独立部署&…...

读论文、学习时 零碎知识点记录01
1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层...

图解C#高级教程(一):委托
什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同,因为委托可以被执行。当执行委托时,委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…...

CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)
【前言】 本期视频就一个任务,通过ARM官方的CMSIS RTOS文档,将常用配置和用法给大家梳理清楚。 对于初次使用CMSIS-RTOS的用户来说,通过梳理官方文档,可以系统的了解各种用法,方便大家再进一步的自学或者应用&#x…...

渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验
写在前面 由于验证码在服务端生成后存储在服务器的session中,而标用于标识用户身份的sessionid存在于用户cookie中 所以本次识别验证码时需要用requests.session()创建会话对象,模拟真实的浏览器行为,保持与服务器的会话才能获取登录时服务…...

docker环境下配置cerbot获取免费ssl证书并自动续期
文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 :爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...