redis应用之缓存穿透、缓存击穿、缓存雪崩

2023-11-08

redis应用之缓存穿透、缓存击穿、缓存雪崩

记录一下redis应用中常见的三大问题。

首先看一下应用redis作为缓存的系统数据访问的架构图:
在这里插入图片描述
客户端发起一个查询请求的时候,首先去缓存中查询,如果数据在缓存中存在,则直接将缓存中的数据返回给客户端;如果数据在缓存中不存在,则继续查询数据库,如果数据在数据库中存在,则将该数据放入缓存中,并返回给客户端,如果数据在数据库中也不存在,则直接返回null给客户端。

一、什么是缓存穿透?

缓存穿透是指查询缓存和数据库都不存在的数据,导致每次查询都会透过缓存,直接查询数据库。
在这里插入图片描述

缓存穿透解决方案
1、缓存空对象
2、布隆过滤器

缓存空对象就是当数据库中查不到数据的时候,缓存一个空对象,然后给空对象设置一个很短的过期时间,从而达到减少数据库压力的目的。但这种解决方式有两个缺点:(1)缓存空对象浪费空间。(2)会导致数据库和缓存的数据不一致。

布隆过滤器是一种数据结构,相当于在客户端和缓存中间加了一个过滤器,布隆过滤器会对缓存中所有的key进行n次hash运算,这样可以得到n个位置,然后将这n个位置的元素置为1。但客户端查询时,也会对查询的key进行n次hash运算,得到n个位置,如果这n个位置全为1则,去缓存查询,否则返回空给客户端。

举个例子,比如我们一共有3个key,我们对这3个key分别进行3次hash运算,key1经过三次hash运算后的结果分别为2/6/10,那么就把布隆过滤器中下标为2/6/10的元素值更新为1,然后再分别对key2和key3做同样操作,结果如下图:

在这里插入图片描述
这样,当客户端查询时,也对查询的key做3次hash运算得到3个位置,然后看布隆过滤器中对应位置元素的值是否为1,如果所有对应位置元素的值都为1,就证明key在库中存在,则继续向下查询;如果3个位置中有任意一个位置的值不为1,那么就证明key在库中不存在,直接返回客户端空即可。如下图:

在这里插入图片描述
当客户端查询key4时,key4的3次hash运算中,有一个位置8的值为0,就说明key4在库中不存在,直接返回客户端空即可。
所以,布隆过滤器就相当于一个位于客户端与缓存层中间的拦截器一样,负责判断key是否在集合中存在。如下图:

在这里插入图片描述
布隆过滤器的好处就是解决了第一种缓存空值的不足,但布隆过滤器也存在缺陷,首先,它有误判的可能,比如在上面客户端查询key4的图中,假如key4经过3次hash运算得到的位置分别是2/4/6,由于这3个位置的值都是1,所以,布隆过滤器就认为key4在库中存在,进而继续向下查询了。所以,布隆过滤器判断存在的key实际上可能是不存在的,但布隆过滤器判断不存在的key是一定不存在的。它的第二个缺点就是删除元素比较难,比如现在要删除key2这个元素,那么需要将2/7/11三个位置的元素值改为0,但这样就会影响到key1和key3的判断。

2、什么是缓存击穿?

缓存击穿是指当缓存中的热点数据过期了,在该热点数据重新载入内存前有大量查询请求穿过缓存,直接查询数据库,导致数据库压力过大。
在这里插入图片描述

缓存击穿解决方案
(1)设置key永不过期。
(2)使用分布式锁

第一种比较简单不再多说,第二种使用加分布锁的方式,锁对象是热点数据的key,同一时刻只能有一个线程获得锁对象,然后去查询数据库,把结果放到缓存中,释放锁。其他线程直接到缓存中取数据,不再需要查询数据库
在这里插入图片描述

3、什么是缓存雪崩

缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者redis服务器宕机,导致大量的请求查询数据库,导致数据库压力加大。
在这里插入图片描述
缓存雪崩解决方案
(1)将每个key的过期时间打散,使他们的失效时间均匀分布
(2)部署redis时使用集群,主从复制,哨兵。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis应用之缓存穿透、缓存击穿、缓存雪崩 的相关文章

随机推荐

  • 2020年秋招嵌入式软件面试过程总结(华为联发科小米兆易创新)

    秋招投递公司23家 简历被刷1家 笔试 测评挂掉3家 至今无消息的8家 获得Offer的公司有小米 兆易创新 全志科技 浙江大华 海格通信 京信通信 景嘉微电子 广州朗国电子 北京华大电子 中国长城科技集团 文章目录 有面试 联发科北京 7
  • shiro框架---通过系统介绍shiro框架中的实现逻辑

    接上一篇文章关于shiro框架的简单介绍及用户表的建立维护 项目已分享到GitHub上 如果需要的可以看下 springboot shiro项目Git下载地址 本篇主要通过一个已经实现用户登录和权限验证的系统 结合sql 展示一下我的实现
  • 听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider

    前言 NET平台的开发一直都只能使用Visual Studio来开发 自从dotnet core 发布后不久 jetbrains 发布了Rider预览版 到目前为止的正式版2017 3 1 博主都使用过 因为博主的主力开发语言是C 所以一直
  • 你不知道的JavaScript-----词法作用域

    作用域 引擎就是老大 是终极控制中心 控制整个程序的执行 编译器是协助引擎解析程序 而作用域是解析程序的一种规则 注意 无论函数在哪里调用 也无论它如何被调用 它的词法作用域都只由函数被声明时所处的位置决定 词法阶段 词法作用域就是定义在词
  • 基于vue的文件夹上传插件

    基于vue simple uploader封装文件分片上传 秒传及断点续传的全局上传插件 1 前言 之前公司要在管理系统中做一个全局上传插件 即切换各个页面的时候 上传界面还在并且上传不会受到影响 这在vue这种spa框架面前并不是什么难题
  • statsmodels API

    1 介绍 主要的 statsmodels API 分为以下模块 statsmodels api 横截面模型和方法 statsmodels tsa api 时间序列模型和方法 statsmodels formula api 使用公式字符串和
  • 《数学建模与数学实验》第5版 非线性规划 习题4.4

    文章目录 1 一电路由三个电阻 R 1 R 2
  • JAVA框架03 -- Spring

    概念相关 spring 是什么 Spring 是分层的 Java SE EE 应用 full stack 轻量级开源框架 以 IoC Inverse Of Control 反转控制 和 AOP Aspect Oriented Program
  • JavaWeb核心技术——Web概述

    目录 1 Web概述 1 1 Web和JavaWeb的概念 1 2 JavaWeb技术栈 1 2 1 B S架构 1 2 2 静态资源 1 2 3 动态资源 1 2 4 数据库 1 2 5 HTTP协议 1 2 6 Web服务器 1 Web
  • 【华为OD】

    目录 一 题目描述 二 输入描述 三 输出描述 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 给定两个字符串 s1 和 s2 和正整数 K 其中 s1 长度为 n1 s2 长度为 n2 在 s2 中选一个
  • 跳频技术——学习总结(一)

    跳频技术 学习总结 一 开始跳频的学习快一个月了吧 最近才停下其它事情 集中时间看了一些内容 资料有 跳频通信干扰与抗干扰技术 那丹彤 跳频通信 梅文华 和网上百度的各种资料 一 扩频概念和分类 扩频通信 一种利用与信息无关的伪随机序列使射
  • Linux之GPIO应用

    目录 一 sysfs 文件系统 二 LED标准接口 三 GPIO标准接口 1 gpiochipX 2 export direction value active low edge 3 unexport 在 Linux 系统下 一切皆文件 应
  • 外包的水太深了,18k的阿里外包不太敢去.....

    有挺多测试员曾在BAT 网易这些大厂做过外包 想必大家也是非常关心此类问题 我就想介绍下 什么是外包 外包公司的现状 就 为什么这么多人鄙视外包测试岗 阿里18K的外包测试岗能去吗 谈谈自己的想法 什么是外包 外包指企业在管理系统实施过程中
  • Environment Modules

    什么是 Environment Modules 通常 用户在登录时通过为会话期间要引用的每个应用程序设置环境信息来初始化其环境 Environment Modules包 是一个简化shell初始化的工具 它允许用户在使用 modulefil
  • JSTL的基本使用

    开发工具与关键技术 IDEA 撰写时间 2022 8 28 前提 创建一个java Maven项目 并把 Tomcat 装上 并在后端传数据到jsp页面 在 pox xml文件下导入该jar包
  • WEB_HCTF_2018_WarmUp

    Categories web 代码审计 write up source code get source code http eb22847d 9f8a 4ecf b972 5ecebfcf5faf node3 buuoj cn source
  • C++ sizeof() 和一道面试题

    首先要明确sizeof不是函数 也不是一元运算符 他是个类似宏定义的特殊关键字 sizeof 括号内在编译过程中是不被编译的 而是被替代类型 如int a 8 sizeof a 在编译过程中 它不管a的值是什么 只是被替换成类型sizeof
  • 使用Jsoncpp生成和解析Json字符串

    上一篇 同大家一起分享了QJson的移植 Qt4 8 3 使用技巧 如何移植和使用QJson 本篇我们来熟悉下使用Jsoncpp生成和解析Json字符串 当然作为Qt的狂热爱好者 我还是会继续改造Jsoncpp项目 来一个Qt项目版 需要下
  • 欧姆龙PLC伺服功能块 功能块可供选择脉冲0-3,脉冲输出方式CW/CCW或者脉冲加方向

    欧姆龙PLC伺服功能块 功能块可供选择脉冲0 3 脉冲输出方式CW CCW或者脉冲加方向 一个功能块实现伺服点动 相对位置 绝对位置 伺服回原点所有操作 所有一些标志位 都有对应的输入和输出 程序里都有讲解和注明 ID 6920615056
  • redis应用之缓存穿透、缓存击穿、缓存雪崩

    redis应用之缓存穿透 缓存击穿 缓存雪崩 记录一下redis应用中常见的三大问题 首先看一下应用redis作为缓存的系统数据访问的架构图 客户端发起一个查询请求的时候 首先去缓存中查询 如果数据在缓存中存在 则直接将缓存中的数据返回给客