redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿

news2024/11/17 6:38:10

1.缓存一致性:

缓存一致性就是通过各种方法保证缓存与数据库信息一种,其中最多的办法就是想尽一切办法对过期key进行清除,以保证redis和数据库信息一只,其中就包括了这篇文章中提到的内存淘汰策略,过期key的清除等等,当然也包括在代码中进行手动清除过期key,不过手动清除时需要注意要保证数据库的更新和redis的清除都成功完成,可以使用的方法包括,使用事务,使用相关服务将redis和数据库进行整合,或者只操作redis,再由redis操作数据库等等。

当我们选择手动事务更新数据库和redis保证其一致性时需要注意以下几点:

当我们更新数据库后,应该选择删除redis缓存,而不是更新,因为更新操作收益不大,并且操作繁琐容易出错。并且应该先更改数据库在删除缓存,因为更改操作耗时更长,如果先删除再修改,容易造成在修改过程中,数据被其他线程读取,然后向缓存中写入修改前的数据,而后删除则可以避免这种情况。

在高一致性的要求下可以采用手动更新数据库和redis,而低一致性的情况下可以使用redis自带的内存淘汰机制

2.缓存穿透

缓存穿透是指当一个数据为空时,缓存无法命中,数据库也无法命中,数据库无法命中导致无法写入redis,这样所有的请求都会涌入数据库,这就叫缓存穿透

解决方法分两种

1.返回null

当数据库没有数据时可以使redis缓存null值并且设置过期时间,这样便可以避免请求进入数据库,确实是会造成额外的性能损耗,以及当数据库存入数据时,在null过期时间之内无法访问到,会造成短时间内的数据不一致

2.布隆过滤

布隆过滤是将有可能会造成数据穿透的数据保存在一个极长的二进制数中,他会将这个数据经过十六个哈希函数的运算,最终映射到二进制数上

当再次请求这个数据时会先经过布隆过滤的十六个哈希函数,判断是否映射在了二进制数上,如果有则去访问,没有则不允许访问。当数据增多时,布隆过滤会造成误判,有可能将不存在的数据判定为存在,因为1过多,映射容易重复,不过概率极低

3.缓存雪崩

缓存雪崩是指同一时间大量key失效,或redis服务器宕机,导致大量请求涌入数据库。

解决方法包括:

1.设置不同的过期时间

通常,当我们设置缓存时,可能会给所有的缓存项设置相同的过期时间。这样做的问题在于,如果大量缓存同时过期,那么这些请求都会同时转到数据库上,可能会导致数据库瞬间压力过大。为了避免这种情况,我们可以对每个缓存项的过期时间添加随机的几分钟,这样缓存项的过期时间就会分散开来,避免同一时刻大量请求打到数据库。

2. 设置缓存重试策略

当缓存失效后,如果所有请求都立即转向数据库,数据库可能会处理不过来。我们可以设置一种机制,让这些请求不是立即都发送,而是通过一些延迟和重试的策略(比如,第一次失败后等待100毫秒,第二次失败后等待200毫秒),这样可以避免在极短的时间内给数据库带来过大的压力。

3. 使用熔断器

熔断器是一种自动开关机制,当检测到对数据库的请求过多时,它会暂时“断开”,阻止进一步的请求,以保护数据库。这可以防止在缓存失效后,大量请求直接涌向数据库造成的崩溃。

4. 预热缓存

预热缓存指的是在缓存正式到期和被删除前,系统自动地刷新缓存数据。这样,即使缓存条目过期,新的数据已经被加载并准备好,请求仍然可以从缓存中获取数据,而不需要去数据库中查询。

5. 使用分布式缓存

通过将缓存扩展到多个Redis服务器或使用其他分布式缓存系统,可以降低单个Redis实例出问题导致的影响。分布式缓存通过多个节点协作,即使某个节点出现故障,其他节点仍能提供服务。

6. 限流

限流是指对来自客户端的请求速率进行控制,确保系统在高流量时不会被过度负载。通过限制每秒处理的请求量,可以保护后端数据库不被过多的请求同时击垮。

4缓存击穿

缓存击穿是指一个用于大量高并发访问,并且缓存重建业务复杂的key失效,大量请求涌入数据库

解决方法分为两种

1.互斥锁

在线程访问redis失败,访问数据库的途中添加互斥锁,只有拥有锁的线程才能使用数据库数据并且重新构建缓存,其他线程只能等待该线程构建redis后使用缓存数据

2.逻辑过期

逻辑过期是互斥锁的加强版,他不在设置key的过期时间,而是通过字段的方式存储key过期时间,这样只有我们的代码特意查看时才会发现该key过期,而redis则不知道还会继续保留该key,而当一个线程发现过期时会获取锁并且重新构建redis,在这个过程中,其他没有获取锁的线程会继续用旧值完成业务。

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

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

相关文章

Bookends for Mac:文献管理工具

Bookends for Mac,一款专为学术、研究和写作领域设计的文献管理工具,以其强大而高效的功能深受用户喜爱。这款软件支持多种文件格式,如PDF、DOC、RTF等,能够自动提取文献的关键信息,如作者、标题、出版社等&#xff0c…

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接(TCP三次握手)---经典面试题3.2断开连接(四次挥手)3.3TCP状态转换 四…

Delta lake with Java--在spark集群上运行程序

昨天写了第一篇入门,今天看见有人收藏,继续努力学习下去。今天要实现的内容是如何将昨天的HelloDetlaLake 在spark集群上运行,。具体步骤如下 1、安装spark,我使用的是 spark-3.5.1-bin-hadoop3-scala2.13,去官网下载&#xff0c…

微服务----nacos配置及简单使用

目录 什么是nacos 项目在nacos上进行注册 注入nacos依赖 配置application.yml文件 nacos写入配置文件 首先,还是需要导入依赖 然后在nacos中编写配置文件 prod是我自定义的一个命名空间,在这里面进行配置文件编写~ 启动类上加上注解 编写Patt…

Java与Go:并发

在此之前,我们先要明白什么是并发?为什么要并发编程? 在计算机中,同一时刻,只能有一条指令,在一个CPU上执行 后面的指令必须等到前面指令执行完才能执行,就是串行。在早年CPU核心数还少的时候倒…

求矩阵对角线元素之和(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int sum 0;int a[3][3] { 0 };//获取数组a的值&#xff1b;printf(&qu…

pandas学习笔记12

缺失数据处理 其实在很多时候&#xff0c;人们往往不愿意过多透露自己的信息。假如您正在对用户的产品体验做调查&#xff0c;在这个过程中您会发现&#xff0c;一些用户很乐意分享自己使用产品的体验&#xff0c;但他是不愿意透露自己的姓名和联系方式&#xff1b; 还有一些用…

【论文阅读】Learning Texture Transformer Network for Image Super-Resolution

Learning Texture Transformer Network for Image Super-Resolution 论文地址Abstract1. 简介2.相关工作2.1单图像超分辨率2.2 Reference-based Image Super-Resolution 3. 方法3.1. Texture TransformerLearnable Texture Extractor 可学习的纹理提取器。Relevance Embedding.…

Linux的socket详解

一、本机直接的进程通信方式 管道&#xff08;Pipes&#xff09;&#xff1a; 匿名管道&#xff08;Anonymous pipes&#xff09;&#xff1a;通常用于父子进程间的通信&#xff0c;它是单向的。命名管道&#xff08;Named pipes&#xff0c;也称FIFO&#xff09;&#xff1a;允…

【Linux】进程控制 之 进程创建 进程终止 进程等待 进程替换

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

H.265 与 H.264 的主要区别

H.265 与 H.264 的主要区别 H.265 与 H.264 的主要区别各模块技术差异汇总宏块划分帧内预测模式帧间预测模式去块滤波ALF自适应环路滤波采样点自适应偏移&#xff08;Sample Adaptive Offset&#xff09;滤波并行化设计TileEntropy sliceDependent SliceWPP&#xff08;Wavefro…

docker部署nginx并实现https

文章目录 docker部署nginx并实现https1、服务器环境2、安装docker3、准备证书4、准备nginx配置文件和dockerfile文件5、创建nginx镜像与容器6、验证访问 docker部署nginx并实现https 1、服务器环境 [rootliuyanfen12 ~]#systemctl stop firewalld [rootliuyanfen12 ~]#setenf…

HTML/CSS1

1.前置说明 请点这里 2.img元素 格式&#xff1a; <img src"图片地址" alt"占位文字" width"图片宽度" height"图片高度">其中alt是当图片加载失败时显示的文字 而且不同内核的浏览器显示出来的占位文字的效果也是不尽相同的…

Django之单文件上传(以图片为例)

一&#xff0c;创建项目 初始化&#xff0c;数据迁移&#xff0c;创建superuser&#xff0c;创建app等 二&#xff0c;配置settings.py 1&#xff0c;配置数据库&#xff08;本作者使用的mysql&#xff09;&#xff0c;以前文章有提到 2&#xff0c;配置静态文件存放路径 STAT…

论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比&#xff0c;它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

安卓硬件访问服务

安卓硬件访问服务 硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。 由于硬件抽象层模块是使用C语言开发的&#xff0c; 而应用程序框架层中的硬件访问服务是使用Java语言开发的&#xff0c; 因此&#xff0c; 硬件访问服务必须通过Java本地接口&#xff08;Jav…

EPAI手绘建模APP演示板、材质编辑器、样式编辑器

(11) 更多 图 74 更多工具栏 ① 演示板&#xff1a;打开关闭演示板。演示板用来显示从设备导入的模型图纸图片或者打开模型建模教程网页&#xff0c;是建模过程中一个辅助功能。有些设备有小窗口功能有些没有&#xff0c;对于没有小窗口功能的设备&#xff0c;通过演示板能够在…

A Bug‘s Life (并查集)

//新生训练 #include <iostream> #include <algorithm> using namespace std; const int N 5000; int p[N], sz[N]; int n, m; int find(int x) {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {int T;scanf("%d", &T);for (int k 1; …

车载电子电器架构 —— 通信安全E2E Rollng counter

车载电子电器架构 —— 通信安全E2E Rollng counter 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要…

17_Scala面向对象高阶功能

文章目录 1.继承1.1 构造对象时,父类对象优于子类对象1.2父类主构造有参数,子类必须要显示地调用父类主构造器并传值 2.封装3.抽象3.1抽象定义3.2子类继承抽象类3.3抽象属性 4.伴生对象4.1创建类和伴生对象4.2调用 1.继承 –和Java一样,权限protected , public.父类定义子类用…