Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

news2025/6/12 22:30:59

文章目录

    • 1.什么是Redis?
    • 2.为什么要使用redis作为mysql的缓存?
    • 3.什么是缓存雪崩、缓存穿透、缓存击穿?
      • 3.1缓存雪崩
        • 3.1.1 大量缓存同时过期
        • 3.1.2 Redis宕机
      • 3.2 缓存击穿
      • 3.3 缓存穿透
      • 3.4 总结
    • 4. 数据库和缓存如何保持一致性
    • 5. Redis实现分布式锁

1.什么是Redis?

redis是基于内存读写的数据库,因此它的读写速度非常快。常用于缓存、队列、分布式锁等场景。Redis中还有很多数据结构类型:String 、Set、 Hash、 List、ZSet(有序集合)、Bitmaps(位图) HyperLogLog(基数统计)、GEO(地理信息)、Stream(流)。

2.为什么要使用redis作为mysql的缓存?

是因为Redis具有[高性能]和[高并发]的特性。
高性能:由于redis是基于内存读写,其速度远远超过MySQL,因此我们可以将MySQL当中的数据存入到redis当中,下一次直接从redis中读,速度会快很多。
高并发:直接访问redis能承受的请求是远远大于MySQL的。

3.什么是缓存雪崩、缓存穿透、缓存击穿?

3.1缓存雪崩

我们将数据存入到redis当中,之后的每次请求都先去redis当中找是否存在数据。从而提高了查询速度也降低了数据库的压力。为了保证redis和数据库的数据一致性,我们通常会给其设置过期时间。但是如果大量缓存数据在同一时间过期,或者redis宕机,会使得大量请求进入数据库,给数据库带来巨大压力。这就是缓存雪崩。造成这一现象的原因有两个大量缓存同时过期redis宕机
在这里插入图片描述

3.1.1 大量缓存同时过期
  • 设置不同的过期时间
  • 互斥锁

我们可以通过互斥锁来解决大量请求进入数据库的现象。即当发现redis当中没有想要的数据后,先尝试获取锁,如果获取成功就进行查询数据库。而其他线程此时尝试获取锁是会失败的。这样其他线程就必须等查询数据库结束或者直接返回默认值。

  • 不设置过期时间

我们可以不设置过期时间,而是让后台进程进行定时更新数据。但是这也造成了另一个现象:当redis中的数据存储过多,会将一部分数据淘汰,这样业务线程就会读取缓存失败。这有两个解决方案一是让后台线程同时也监测数据是否失效,一旦失效就去数据库从获取二是在线程业务发现数据淘汰后,通过消息队列发送一条消息告诉后台线程更新数据

3.1.2 Redis宕机
  • 服务熔断或限流机制

当Redis宕机之后我们可以将服务熔断,暂停业务应用对缓存服务的访问,并返回错误。等Redis恢复正常再允许访问。或者利用限流机制,可以允许部分请求访问进入数据库,而其他的直接拒绝服务。

  • 构建Redis缓存高可靠集群

服务熔断和限流机制是在Redis宕机之后采取的措施。我们最好通过主从节点的方式构建Redis缓存高可靠集群。如果Redis缓存的主节点故障宕机,从节点可以切换为主节点,继续提供缓存服务。

3.2 缓存击穿

缓存击穿指的是热点key失效,导致大量请求进入数据库,给数据库造成巨大压力。
在这里插入图片描述

缓存击穿与缓存雪崩很相似,可以看作是缓存雪崩的一个子集。它的解决方案也有两种

  • 互斥锁

只有一个进程可以进行数据库的访问,其他进程都需要等待。

  • 不设置过期时间

同样也是通过后台进程进行定时更新数据

3.3 缓存穿透

缓存穿透是指,当我们查询redis时发现没有数据,则该线程查询数据库,结果发现数据库中也不存在该信息,又发送了许多不存在的数据查询,导致这些查询全部都穿透过redis,都去访问数据库,给数据库带来巨大压力 。解决方案有三种:

  • 限制非法请求

直接在API入口处就对信息进行验证,判断是否是恶意非法信息

  • 返回空值或默认值存入redis当中

当我们从数据库中没有查到相关结果后,直接将空值或默认值存入到Redis中,这样,接下来的请求再次到Redis中查询,就能查询到结果。

  • 布隆过滤

3.4 总结

在这里插入图片描述

4. 数据库和缓存如何保持一致性

首先我们要确定的是,我们在对数据库修改时,是修改缓存还是删除缓存呢?毫无疑问一定是删除缓存,这样可以减少大量不必要的操作。
接下来我们要考虑的是先删缓存,在更新数据库,还是先更新数据库,再删除缓存
先删缓存,在更新数据库:考虑极端情况,我们在删除完缓存后,数据库还没有更新完成时,又来了一个线程,进行查询缓存,结果没有查到。接着去查询数据库,此时数据库还是旧数据。查到后,又将旧数据存到Redis中,之后数据库完成了修改,这时数据库和缓存就不一致了。
在这里插入图片描述

先更新数据库,再删除缓存:考虑极端情况,我们在线程一查询Redis结果没有查到,那么继续查询数据库,并将信息写入Redis,此时出现了线程2对数据库进行修改。这导致存入Redis的是旧数据,而数据库中的是新数据。
在这里插入图片描述

表面上两者都可能出现数据不一致问题,但是写入redis的速度很快,所以在写入之前又更新数据这种情况发生的概率很低。因此我们选择先更新数据库,再删除缓存

5. Redis实现分布式锁

分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。如下图所示:
在这里插入图片描述
由于Redis本身可以被多个客户端共享访问,因此可以作为存储锁的容器。而且Redis中set还有个NX选项,作用是如果集合中存在key就插入失败,如果不存在,则插入成功。我们可以基于这个实现分布式锁。即当集合中不存在该key时,插入成功,表示获取到锁了,如果插入失败,说明此时没有获取到锁
同时还需要有以下注意点:

  • 锁变量需要设置过期时间,以免该线程获取到锁之后由于某些原因造成堵塞,其他进程也无法进行。
  • 锁变量的值需要能区分来自不同客户端的加锁操作,以免在释放锁时,出现误释放操作,所以,我们使用 SET 命令设置锁变量值时,每个客户端设置的值是一个唯一值,用于标识客户端;
SET lock_key unique_value NX PX 10000

lock_key:代表锁的key
unique_value:代表该锁的唯一value

同时我们删除锁时需要判断这个value是否是当前客户端的。但是由于先判断再删除,这是两步操作,为保证原子性。我们采用lua脚本实现

// 释放锁时,先比较 unique_value 是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
 end

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

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

相关文章

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)&#xff0…

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…