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

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,在这个过程中,其他没有获取锁的线程会继续用旧值完成业务。

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

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

相关文章

MongoDB的分片集群

MongoDB分片技术 介绍 ​ 分片(sharding)是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。 ​ 与MySQL分库方案对比,MongoDB…

微信小程序之搜索框样式(带源码)

一、效果图&#xff1a; 点击搜索框&#xff0c;“请输入搜索内容消失”&#xff0c;可输入关键字 二、代码&#xff1a; 2.1、WXML代码&#xff1a; <!--搜索框部分--><view class"search"><view class"search-btn">&#x1f50d;&l…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …

图像处理ASIC设计方法 笔记21 标记ASIC的顶层状态机

目录 (一)标记ASIC的工作流程1 ASIC首先从控制寄存器内读出待标记图像的基本参数2若写入了有效的启动命令,则进入下面一帧图像的标记过程。3 ASIC通过接口模块从FIFO1中读取待标记的图像4一帧图像初步标记完成后进行等价表的整理压缩5从临时标记存储器中读取临时标记送入标记…

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片&#xff0c;具体步骤如下&#xff1a; 1.点击新的仓库按钮 2.初始配置&#xff1a;随便填写一个仓库名&#xff1b;这里的仓库状态一定要是public公开的&#xff0c;不然后面访问不了图片 下载PicGo PicGo官网 在A…

【深度学习基础(3)】初识神经网络之深度学习hello world

文章目录 一. 训练Keras中的MNIST数据集二. 工作流程1. 构建神经网络2. 准备图像数据3. 训练模型4. 利用模型进行预测5. (新数据上)评估模型精度 本节将首先给出一个神经网络示例&#xff0c;引出如下概念。了解完本节后&#xff0c;可以对神经网络在代码上的实现有一个整体的了…

【深度学习】Yolov8使用心得

兜兜转转&#xff0c;原本以为和yolov没啥关系了&#xff0c;但是新公司又回到了yolov侧。 yolov8 可以用pip的方式安装&#xff0c;以package的三方软件包形式&#xff0c;隐藏了很多细节。当然你也可以从git上把全套代码down下来。 1.分类模型 1.1 改错误 位置&#xff1a…

区块链扩容:水平扩展 vs.垂直扩展

1. 引言 随着Rollups 的兴起&#xff0c;区块链扩容一直集中在模块化&#xff08;modular&#xff09;vs. 整体式&#xff08;monolithic&#xff09;之争。 如今&#xff0c;模块化与整体式这种一分为二的心理模型&#xff0c;已不适合于当前的扩容场景。本文&#xff0c;将展…

Python机器学习手册:从预处理到深度学习的实际解决方案

书籍&#xff1a;Machine Learning with Python Cookbook: Practical Solutions from Preprocessing to Deep Learning 作者&#xff1a;Kyle Gallatin&#xff0c;Chris Albon 出版&#xff1a;OReilly Media 书籍下载-《Python机器学习手册&#xff1a;从预处理到深度学习…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…

IoTDB 入门教程 基础篇⑦——数据库管理工具 | DBeaver 连接 IoTDB

文章目录 一、前文二、下载iotdb-jdbc三、安装DBeaver3.1 DBeaver 下载3.2 DBeaver 安装 四、安装驱动五、连接数据库六、参考 一、前文 IoTDB入门教程——导读 二、下载iotdb-jdbc 下载地址org/apache/iotdb/iotdb-jdbc&#xff1a;https://maven.proxy.ustclug.org/maven2/o…

微信小程序 uniapp家庭食谱菜谱食材网上商城系统小程序ko137

随着生活节奏的不断加快&#xff0c;越来越多的人因为工作忙而没有时间自己出去订购喜欢的菜品。随着Internet的飞速发展&#xff0c;网络已经成为我们日常生活中必不可少的部分&#xff0c;越来越多的人也接受了电子商务这种快捷、方便的交易方式。网上订餐其独有的便捷性和直…

计算机网络——Dijkstra路由算法

实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间&#xff0c;然后给点映射数字&#xff0c;构建图。程序获取用户输入的学号&#xff0c;构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点&#xff0…

Docker 中的 Nginx 服务为什么要启用 HTTPS

一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 安装Docker CE 20.10.17 s…

【React】React-redux多组件间的状态传递

效果&#xff08;部分完整代码在最底部&#xff09;&#xff1a; 编写 Person 组件 上面的 Count 组件&#xff0c;已经在前面几篇写过了&#xff0c;也可以直接翻到最底部看 首先我们需要在 containers 文件夹下编写 Person 组件的容器组件 首先我们需要编写 index.jsx 文件…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

QT5之windowswidget_菜单栏+工具栏_核心控件_浮动窗口_模态对话框_标准对话框/文本对话框

菜单栏工具栏 新建工程基类是QMainWindow 1、 2、 3、 点.pro文件&#xff0c;添加配置 因为之后用到lambda&#xff1b; 在.pro文件添加配置c11 CONFIG c11 #不能加分号 添加头文件 #include <QMenuBar>//菜单栏的头文件 主窗口代码mainwindow.cpp文件 #include &q…

深入理解分布式事务⑨ ---->MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解

目录 MySQL 事务的实现原理 之 MySQL 中的XA 事务&#xff08;基本原理、流程分析、事务语法、简单例子演示&#xff09;详解MySQL 中的 XA 事务1、XA 事务的基本原理1-1&#xff1a;XA 事务模型图&#xff1a;1-2&#xff1a;XA 事务模型的两阶段提交操作&#xff1a;Prepare …

「 网络安全常用术语解读 」通用漏洞报告框架CVRF详解

1. 背景 ICASI在推进多供应商协调漏洞披露方面处于领先地位&#xff0c;引入了通用漏洞报告框架&#xff08;Common Vulnerability Reporting Format&#xff0c;CVRF&#xff09;标准&#xff0c;制定了统一安全事件响应计划&#xff08;USIRP&#xff09;的原则&#xff0c;…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…