正常处理流程

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

缓存穿透

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

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

  解决方案:

  • 缓存空对象。

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

  • 使用布隆过滤器。

缓存击穿

  基本概念:一个缓存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. GIT 基础操作-初始化

    命令行说明 全局设置 git config --global user.name "" git config --global user.email "" 创建 ...

  2. 记录网站从http升级到https遇到的问题

    1.静态资源(js.css)引入问题 在使用http是之后,如果你的站点出现引入外部的js.css等,你需要修改你的资源引入,cdn的话可以写成://cdn.bootscdn.com/jquery.m ...

  3. [tldr]GO使用正则表达式

    简述如何使用GO调用正则表达式 是否符合条件 使用MatchString方法实现 _, err := regexp.MatchString(regex, str) 提取内容 Compile 第一步需要 ...

  4. React从webpack迁移到rsbuild 纪实

    Why 随着团队项目规模越来越大之后,继从babel-loader迁移到esbuild之后发现打包.热重载性能随着时间迭代之后又慢慢开始成为性能瓶颈,所以决定用新的打包工具去解决这个问题.esbuil ...

  5. oracle修改用户密码的方法

    Oracle用户名及默认密码 修改oracle用户的密码有以下方法: 普通用户 (1)通过alter user语法来进行修改 ,这也是最常见的方式: (2) 第二种方式,是通过password命令来修 ...

  6. 针对于基于surging的dotnetty组件内存泄漏问题

    一.概述 前段时间客户碰到基于surging内存泄漏问题,邀请我来现场帮忙解决,对于dotnetty 我一直又爱又恨,因堆外内存DirectByteBufferChunk 中PoolChunk映射分配 ...

  7. MaxKB+Ollama 离线部署

    主题:在 Centos7 环境部署 MaxKB 以及 Ollama 实现基于离线大模型的的小助手调用. 选择离线部署的原因:原计划是打算直接使用 1Panel 进行 MaxKB 和 Ollama 一键 ...

  8. Golang 语言学习路线

    学习Go语言是一个很好的选择,它具有高效的编译速度.强大的并发支持和简洁的语法.适用于初学者的Golang学习路线: 1. 学习基础: 安装Go:从官方网站下载并安装Go语言的最新版本. Hello, ...

  9. STM32 开发环境用哪个呢?

    我的STM32开发环境血泪史:从入门到精通,少走弯路才是硬道理 说起STM32开发环境的选择,我真是有太多想说的了.作为一个已经在嵌入式领域摸爬滚打近十年的老兵,从当年刚入行时的懵懂无知,到现在能够从 ...

  10. Hangfire Redis 实现秒级定时任务、使用 CQRS 实现动态执行代码

    目录 定时任务需求 核心逻辑 使用 Redis 实现秒级定时任务 第一步 第二步 第三步 第四步 业务服务实现动态代码 第一步 第二步 第三步 第四步 第五步 最后 定时任务需求 本文示例项目仓库:w ...