Redis做缓存的几种模式以及缓存雪崩、缓存击穿、缓存穿透分别是什么,怎么解决

news/发布时间2024/6/1 4:09:25

怎么做

缓存可以建立在客户端也可以建立在服务端(注意这里是广义的客户端、服务端,服务A向服务B发请求,那么A就是客户端

理论上来将每个服务端都应该给自己建立缓存,因为微服务要有一定的互不信任原则(请求先到你,你做过校验了,我不一定信)

四种模式

cache aside(旁路缓存)

最常用方式,就是先去看缓存有没有,有就返回,没有就去数据库读。
写的话直接写数据库去,然后删除缓存。
为啥不更新缓存而是删除缓存? 因为更新容易造成时序性问题:
thread1更新mysql为4 -> thread2更新mysql为2 -> thread2更新缓存为2 -> thread1更新缓存为4

read through

起一个中间服务,客户端就查你这个代理,不知道查的是缓存还是数据库。一切和缓存、数据库的交道都由这个代理来做。

write through

也是起了一个中间服务,只要发起写请求,代理就直接写数据库,然后同步更新redis。一般和read through搭配使用。
但这个对缓存压力比较大,只要更新了数据就得一同更新redis,对比旁路缓存是删除缓存数据的

write behind

和write through一样,只不过写完数据库不立即写缓存,而是异步的写缓存(找一个合适时间点,比如低负载时候;或者累计几个一并写入)。

缓存穿透

缓存和数据库都没有这个数据,一般是被攻击了,有人频繁查询不存在的key。
解决方法:

  • 接口层设置校验,key异常的直接拦截
  • 缓存和数据库都没有的数据,在缓存里写key-null,然后设置一个较短的过期时间,比如30s(防止之后真有这个key写进数据库了,缓存数据还是null)
  • 布隆过滤器。一个key会被多个hash函数映射,假设这些位置都被点亮认为这个数据可能是存在的,可以去数据库查一下。要是有的hash位置没被点亮,就是拒绝。这样对时间空间都好,就是不完全准确。

缓存击穿

缓存没有,数据库有。通常是某一时刻,一个热点数据过期,恰好此时并发用户特别多来访问这个数据,结果都打到数据库上了。
解决方法:

  • 被持续访问的数据适当延长过期时间
  • 加互斥锁,多线程来发现缓存没有,就会竞争去数据库查。只有一个线程去查了,查完更新缓存,其他线程直接查缓存了就。

缓存雪崩

缓存没有数据库有。通常是缓存中大批数据同时过期了,而这时候大量查询过来了,让数据库压力过大甚至宕机。
解决方法:

  • 设置随机过期时间,别一起过期
  • 加互斥锁,多线程来发现缓存没有,就会竞争去数据库查。只有一个线程去查了,查完更新缓存,其他线程直接查缓存了就。

缓存一致性问题

就是redis和mysql数据不一致了,主要有三种方式。但其实兜兜转转说一堆假设产品对一致性要求极高,尽量别用缓存

mysql更新后不管redis,靠过期时间兜底

实现起来成本低,但是这就得容忍一段时间的数据库和缓存不一致问题了。

mysql更新后,操作redis

操作分为两种一种是更新另一种是删除,更倾向于使用后一种。假设删除失败了,会退化成第一种方案。

异步将mysql的更新同步给redis

redis作为mysql一个slave,订阅mysql的binlog日志,解析日志后更新回redis。这种方式要搭建一个同步服务,成本大一点,但是解耦了,更新mysql后不需要做额外的工作,比较适合数据过期时间长甚至是不过期的场景(这是原因,是因为这种场景,才会用到这种订阅binlog模式)

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

大话设计模式——2.简单工厂模式(Simple Factory Pattern)

定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。 UML图: 例子: 计…

1.30主成分分析,因子分析

主成分分析 主成分分析(Principal Component Analysis,简称PCA)是一种常用的多变量数据分析方法。它用于降低数据维度,以便更好地理解和解释数据集中的变化。PCA通过将原始数据投影到新的坐标轴上,使得新的坐标轴上的…

nodejs+vue+ElementUi废品废弃资源回收系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统,管理员可以对系统用户管理、用户信息管理、回收站点管理、站点分类管理、站点分类管理、留言板管理、系统管理进行添加、查询、修改、删除,以保障废弃资源回收系统系统的正常…

HarmonyOS4.0系统性深入开发36 媒体查询(mediaquery)

媒体查询(mediaquery) 概述 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(比如显…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

拿捏c语言指针(下)

前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针&#xff08;上&#xff09;和 拿捏c语言指针&#xff08;中&#xff09; ​​​​​​没有看的小伙伴要抓紧喽~ 欢迎关注​​个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#x…

【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)

文章目录 七、回溯算法八、贪心算法九、动态规划9.1 背包问题9.2 01背包9.3 完全背包9.4 多重背包 十、图论10.1 深度优先搜索10.2 广度优先搜索10.3 并查集 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础…

【kubernetes】二进制部署k8s集群之,多master节点负载均衡以及高可用(下)

↑↑↑↑接上一篇继续部署↑↑↑↑ 之前已经完成了单master节点的部署&#xff0c;现在需要完成多master节点以及实现k8s集群的高可用 一、完成master02节点的初始化操作 二、在master01节点基础上&#xff0c;完成master02节点部署 步骤一&#xff1a;准备好master节点所需…

docker学习总结

docker 1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker 2.Docker的基本操…

CMake和VsCode调试的使用

目录 CMake使用 CMake下载 创建系统文件目录 MakeList编写规范 VsCode启动调试 添加配置文件 添加断点&#xff0c;启动调试 CMake使用 CMake下载 输入指令 sudo apt install cmake 安装cmake&#xff0c;使用 cmake -version可查看cmake的版本信息 创建系统文件目…

【监督学习之决策树和随机森林】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱决策树&#xff08;Decision Tree&#xff09;随机森林&#xff08;Random Forest&#xff09; 简述概要 了解决策树和随机森林 知识图谱 决策树和随机森林都是机器学习中常用的算法&#xff0c;它们在处…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离…

Linux——简单的Shell程序

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后&#xff0c;接下来就是存储数据了。数据的存储有多种多样&#xff0c;其中最简单的一种是将数据直接保存为文本文件&#xff0c;如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

第2部分 基础篇 第2章 区块链技术(2)

2.4.3. 区块链几个核心概念 本聪老师&#xff1a;大家了解哪些区块链概念&#xff1f; 小明&#xff1a;去中心化、智能合约。 小云&#xff1a;共识机制&#xff0c;还有共识算法。 本聪老师&#xff1a;好的&#xff0c;我们从比特币开始&#xff0c;因为区块链诞生于比特…

Stable Diffusion 3震撼发布模型与Sora同架构

Prompt&#xff1a;Epic anime artwork of a wizard atop a mountain at night casting a cosmic spell into the dark sky that says "Stable Diffusion 3" made out of colorful energy Stability AI发布Stable Diffusion 3文本到图像模型。该模型采用扩散变换架构…

git中将所有修改的文件上传到暂存区

案例&#xff1a; 我将本地的多个文件进行了修改&#xff0c;导致文件发生了变化。使用git status命令&#xff0c;查看文件的状态&#xff0c;发现有多个文件是modified&#xff0c;即被修改了。 本地文件发生了变化&#xff0c;需要将modified的文件添加到暂存区&#xff0c…

力扣精选100道——外观数列(模拟专题)

外观数列算法题链接 &#x1f6a9;了解题意 该题的下面充分的给你说明了这个题目的意思。 3 3 2 2 2 5 1 我们根据我们正常读的顺序读 俩个3 三个2 一个5 一个1 连起来就是 2 3 3 2 1 5 1 这就是最终输出的字符串。 题目开头说了&#xff0c;我们最初是 1开始读…

nginx 模块 常见内置变量 location

一、nginx 模块 ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 deny allow ngx_http_auth_basic_module 身份验证 小红小名&#xff08;虚拟用户&#xff09; ftp也有虚拟用户 ngx_http_gzip_module 压缩模块 ngx_http_gzip_static_modul…

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…
推荐文章