AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题

devtools/2024/10/11 3:09:35/

目录

一、三种删除策略比较

二、缓存雪崩+缓存击穿+缓存穿透

三、缓存一致性


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):修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
    • 优势:低耦合,可以同时通知多个缓存服务
    • 缺点:时效性一般,可能存在中间不一致状态
    • 场景:时效性要求一般,有多个服务需要同步

http://www.ppmy.cn/devtools/123946.html

相关文章

electron-vite_1搭建项目

脚手架选型,electron-vite;Electron开发构建工具基于Vite的;目前项目是使用Vite写的所以用这个集成比较快;目前他们也有提供vue和react的模板; 基于 Vite,快速、简单且功能强大 框架连接 electron-vite 目…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

【MySQL 08】复合查询

目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表&#xff0c;将作为示例&#xff0c;理解复合查询 EMP员工表…

Python 工具库每日推荐 【Pandas】

文章目录 引言Python数据处理库的重要性今日推荐:Pandas工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:销售数据分析案例分析高级特性数据合并和连接时间序列处理数据透视表扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScrip…

51单片机的无线通信智能车库门【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块红外传感器光照传感器时钟模块步进电机蓝牙按键、LED、蜂鸣器等模块构成。适用于智能车库自动门、无线控制车库门等相似项目。 可实现功能: 1、LCD1602实时显示北京时间和自动/手动模式&#xff0c;以及验证是否成…

MongoDB快速实战与基本原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=5e038498891617c552667b853742fdc1&type=note&_time=1727935558812 Mongo数据库的特点: mongo数据库和关系型数据库的区别: ​编辑 关系型数据库和文档型数据库的主要概念对比: 下载和启动(具体…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

【Nacos架构 原理】内核设计之Nacos一致性协议

文章目录 Nacos一致性协议为什么需要一致性协议Nacos选择了Raft&#xff08;强一致性&#xff09;&Distro&#xff08;最终一致性&#xff09;服务发现角度配置管理角度 Nacos自研Distro协议背景设计思想数据初始化数据校验写操作读操作 Nacos一致性协议 为什么需要一致性…