正常处理流程

  客户端请求正常的时候,先读缓存,如果数据命中,则返回缓存的值;否则,把从存储层中读取出来的数据缓存至缓存,同时返回客户端。但是,为了保证系统高可用和高性能,设计一个缓存系统时必须考虑的要素包括缓存穿透、缓存击穿、缓存雪崩和缓存并发等。这里,小编给大家简明扼要地综述一下它们的基本概念和解决策略。

缓存穿透

  基本概念:客户端访问缓存和数据库中都没有的数据,如果系统不对其缓存,就出现了缓存穿透。流量大时会导致存储层挂掉。

  简述:缓存中不存在的数据洪水猛兽般袭来,访问穿透到存储层。

  解决方案:

  • 缓存空对象。

    对于未命中缓存和存储层的数据,设置默认值和五分钟左右的有效期(有效期根据业务需要设置)。

  • 使用布隆过滤器。

缓存击穿

  基本概念:一个缓存key是热点数据,在不停的扛着大并发,但过期那一刻持续的大并发就穿破缓存,导致存储层请求量瞬间飙高。

  解决方案:

  • 使用互斥锁。

    在发现缓存失效的时候(判断拿出来的值为空),不是立即去请求DB,而是成功添加互斥锁后再请求DB并回设缓存;否则,就重试查询缓存的方法。

  • 提前使用互斥锁。

    在value内部设置1个超时标签(timeout1),当从cache读取到timeout1发现它已经过期的时候,马上延长timeout1并重新设置到cache,然后再从数据库加载数据并设置到cache中。

  缓存击穿和缓存雪崩的区别在于前者针对某一个key,缓存雪崩则是针对很多key。缓存key在某个时间点过期的时候,恰好有大量的并发请求过来,这些请求发现缓存过期就从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

缓存雪崩

  基本概念:缓存服务器某个节点宕机或断网或者在某一个时间段大量缓存集体失效,请求全部转发到DB,DB压力骤增而引起雪崩。

  解决方案:

  • 使缓存过期时间呈泊松分布。

  • 开启缓存过期事件监听和异步更新策略。

    监听到缓存过期时,异步起一个线程去读数据库,更新缓存。

    修改Redis配置文件,开启过期事件监听:使notify-keyspace-events的值为Ex

缓存并发

  基本概念:多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。当然,另外的解决方案是把set操作放在队列中使其串行化,必须一个一个的执行。

Reference

https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc

Redis实战-缓存穿透、缓存雪崩、缓存击穿和缓存并发的区别和解决方案的更多相关文章

  1. 缓存穿透、雪崩、热点与Redis

    (拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防 ...

  2. Redis缓存穿透和雪崩

    缓存穿透 用户想要查询一个数据 在redis缓存数据库中没有获取到 就会向后端的数据库中查询. 当用户很多 都去访问后端数据库的话,这就会给数据库带来很大的压力. 常见场景:秒杀活动 等 解决方法: ...

  3. Redis系列(八)--缓存穿透、雪崩、更新策略

    1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主 ...

  4. 深入了解Redis(7)-缓存穿透,雪崩,击穿

    redis作为一个内存数据库,在生产环境中使用会遇到许多问题,特别是像电商系统用来存储热点数据,容易出现缓存穿透,雪崩,击穿等问题.所以实际运用中需要做好前期处理工作. 一.缓存雪崩 1.概念 缓存雪 ...

  5. SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范

    最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...

  6. Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了

    Redis中几个“看似”高大上的概念,经常有人提到,某些好事者喜欢死扣概念,实战没多少,嘴巴里冒出来的全是高大上的名词,个人一向鄙视概念党,呵呵! 其实这几个概念:缓存穿透/缓存击穿/缓存雪崩,有一个 ...

  7. Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

    本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透.缓存击穿.缓存雪崩. 1.缓存穿透 一.概念 缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到 ...

  8. NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩

    1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...

  9. Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透

    在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...

  10. Redis缓存穿透、缓存击穿以及缓存雪崩

    作为一个内存数据库,redis也总是免不了有各种各样的问题,这篇文章主要是针对其中三个问题进行讲解:缓存穿透.缓存击穿和缓存雪崩.并给出一些解决方案.这三个问题是基本问题也是面试常问问题. 这篇文章我 ...

随机推荐

  1. typora编辑数学公式

    最后,需要补充两点: 1.如果要导出为docx,需要安装pandoc https://github.com/jgm/pandoc/releases/tag/3.6.3 2.如果要自己写代码,比如输入\ ...

  2. 08_使用python 内置 json 实现数据本地持久化

    使用python 内置 json 实现数据本地持久化 四个json函数 函数 json.load() 将本地json数据文件读取出来,并以列表形式返回从文件对象中读取 JSON 格式的字符串,并将其反 ...

  3. Windows编程----进程:环境变量

    什么是系统环境变量 每台计算机针对当前用户和系统中所有用户分别提供了两个环境变量设置,通过计算机属性>环境变量的界面,我们可以查看当前这台计算机上的所有环境变量,这些环境变量都是key-valu ...

  4. LLM · RL | Plan4MC:使用有向无环图 high-level planning + 基于 RL 执行 low-level policy

    文章标题:Skill Reinforcement Learning and Planning for Open-World Minecraft Tasks 最初发表时间:2023.03 arxiv:h ...

  5. 【P4】Verilog搭建单周期MIPS-CPU

    课下 Bug_Log 1.模块实例化的信号需先定义,且记得定义完备 其实testbench见过多次了,自己写的时候还想不清. 若实例化模块时使用的信号,若事先无声明,则会自动生成1bit此名称信号,自 ...

  6. `go install`指令行为分析

    分析go install [build flags] [packages]指令做了什么,如何实现安装GO软件,我们如何编写一个软件使得可以使用该指令安装自己编写的程序. 参考go官方文档 安装位置 $ ...

  7. vim中文乱码 vim字符集设置

    vim中文乱码 vim字符集设置 vim的设置一般放在/etc/vimrc文件中,不过,建议不要修改它.可以修改~/.vimrc文件(默认不存在,可以自己新建一个),写入所希望的设置. set fil ...

  8. c#数据库操作ORM映射框架

    主要功能介绍 支持Oracle,SQL Server,MySQL,SQLLite等数据库..主要功能: 支持查询返回动态类型Dynamic以及可扩展类型ExpandoDynamic 表拆分,根据某个日 ...

  9. harbor

    一篇带你了解私有仓库 Harbor 的搭建 一.Harbor简介 虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的. Harbo ...

  10. Delphi MEMO 循环往上往下滚动

    // 循环往上滚动 if Memo1.Perform(EM_SCROLL,SB_LINEDOWN,0)=0 then begin Memo1.Perform(WM_VSCROLL,SB_TOP,0); ...