Redis缓存穿透, 击穿, 雪崩

2023-10-29

缓存穿透
缓存穿透是指用户想要查询一个数据, 发现redis内存中没有, 也就是没有缓存命中,于是向持久层数据库查询,发现也没有, 于是本次查询失败, 当用户很多的时候, 缓存中都没有, 于是都去请求持久层数据库, 这会给持久层数据库造成很大压力, 这就是缓存穿透
解决方案
1.布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询的参数 一hash的形式存储。在控制层先进行校验,不符合的则丢弃,从而避免了对底层存储系统的查询压力
2.缓存空对象
当持久化层不命中后,将返回的空对象存储起来,同时设置一个过期时间,之后再访问这个数据就从缓存中获取,保护持久层数据源
对空值设置了过期时间,还会存在缓存层和存储层的数据有一段时间窗口不一致,对于需要保持一致性的业务会有影响

缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期), 这时由于并发用户特别多, 同时读缓存没读到数据, 又同时去数据库去取数据, 引起数据库压力瞬间增大, 造成过大压力.例如当微博热搜, 这个时候这个点的访问量巨大, 然后在某个时刻该热点的缓存过期或者其他情况导致缓存中暂时没有该热点, 这个时候依然大量并发就会全部集中到数据库去查询最新数据并回写缓存, 很有可能在这一瞬间就导致数据库崩溃
解决方案
1.设置热点数据永不过期
从缓存层面来看, 没有设置过期时间, 所以不会出现热点key过期后产生的问题.但是有可能会逐渐的让redis缓存增加, 内存占用庞大
2.加互斥锁
分布式锁: 使用分布式锁, 保证每个key同事只有一个线程去查询后端服务, 其他县城没有获得分布式锁的权限, 因此只需要等待即可. 这种方式将高并发的压力转移到了分布式锁, 因此对分布式锁的考验很大

缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间, 而查询数据量巨大, 引起数据库压力过大甚至down机. 和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了, 很多数据都查不到从而查数据库.
解决方案
1.增加集群中服务器的数量
2.缓存失效后, 通过加锁或者队列来控制读数据库写缓存的线程数量, 对某个key只允许一个线程查询数据和写缓存, 其他线程等待
3.正式部署之前, 把可能的数据提前访问一遍, 可能大量访问的数据就会加载到缓存中, 加载不同的key, 设置不同的过期时间, 让缓存时间尽量均匀

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

Redis缓存穿透, 击穿, 雪崩 的相关文章

  • 有没有办法在 Redis 和关系数据库中使用带有 @RedisHash 的实体?

    我正在使用Spring引导 为了将我的实体保存在关系数据库上 我配置了一个数据源和我的域类 例如 Entity Table schema schema name name tb name public class table name ex
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客

随机推荐

  • 给github项目贡献代码详细步骤

    本文以 dlink 项目为例 1 fork 第一步是打开 github 上的项目地址 然后点击页面右上角的 fork 按钮 将项目 fork 到自己账号的仓库 记得登录自己的 github 账号 具体看下面图示 这个页面 不需要修改什么参数
  • PHP 常用的设计模式跟使用场景

    策略模式 把类中可能改变的方法用成员属性替换 属性是实现对应方法接口的类 本来直接调用类方法 修改后就是调用成员属性类的方法 这样可以在运行时给类设置不同的成员属性达到动态改变调用的方法 使用 Model 类 持有 Query 类 通过调用
  • Android 项目调用第三方库so动态库

    在Android NDK开发中 可以通过自己编写C C 代码来构建so动态库进行调用之外 还可以把so动态库提供给第三方使用 接下来 我将介绍在新创建的Android 项目 或已存在的Android 项目 中如何调用第三方so动态库 关于如
  • ChatGPT的原理与前端领域实践

    一 ChatGPT 简介 ChatGPT的火爆 ChatGPT作为一个web应用 自22年12月发布 仅仅不到3个月的时间 月活用户就累积到1亿 在此之前 最快记录的保持者也需要9个月才达到月活1亿 ChatGPT的反爬 https cha
  • 02-react组件基础-函数组件-类组件(有状态和无状态组件)-事件处理(this指向)-setState修改状态-表单处理(受控组件和非受控组件)-案例

    学习目标 能够使用函数创建组件 函数组件 能够掌握class语法 extends继承 能够使用class创建组件 类组件 能够给React元素绑定事件 能够使用state与setState 能够处理事件中this的指向问题 能够使用受控组件
  • mysql,oracle,sqlserver之表备份

    mysql表备份 1 只复制表结构到新表 只有结构无数据 create table 新表 select from 旧表 where1 2 或create table 新表 like 旧表 此两种方法的区别 使用第一条语句 备份的新表并没有旧
  • C++之共享智能指针shared_ptr的实现

    目录 概念 使用标准库共享智能指针 共享智能指针底层实现 概念 共享指针是可以 由多个栈上智能指针对象 同时托管同一堆上资源的 因为shared ptr的内部实现引用计数来管理有多少智能指针指向了这块堆上资源 当一个共享智能指针出栈时 引用
  • 人脸建模1

    宝宝 把眼睛球体控制器和簇点的translate属性关联之后 选中眼睛一圈隔一个选一个面 给上nhair毛囊 删除结算器等 只留图中鼠标所在位置 毛囊分别对对应位置控制器父子约束 所有控制器做好之后一定要冻结 舌头控制器前面的组p给后面的盒
  • 二、C++语言进阶:动态库与静态库之函数篇

    2 动态库与静态库之函数篇 作用 分离编译 代码重用 分类 分类 作用 后缀 静态库 一个或多个 o目标文件归档在一个文件中 a 共享库 没有main函数的可执行文件 so 动态加载库 没有main函数的可执行文件 接口复合API so 2
  • 让树叶摇动起来

    Shader XW Tree TreeLeaf Simple Properties Color Main Color Color 1 1 1 1 clipAlpha clip Alpha Range 0 1 0 5 MainTex Base
  • Nginx 服务器

    简介 Nginx 是一款HTTP和反向代理服务器 它的内存占用少 能够支持高达五万个并发连接响应 其主要有三个功能 反向代理 负载均衡 反向代理 正向代理 就相当于 VPN 当你想要访问一个服务器但是由于某种原因不能直接访问时 可以去访问一
  • 如何使用 Vagrant 命令行工具创建和管理虚拟机

    创建和管理虚拟机曾经是一个乏味且耗时的过程 在不同的服务器上复制虚拟机也可能具有挑战性 如果必须复制多个虚拟机 情况会变得更加困难 但后来 Vagrant 出现了 它是一种通常与2 类虚拟机管理程序配合使用的命令行或 shell 工具 你可
  • QT从入门到实战x篇_06_信号和槽2:自定义信号和槽函数的创建及使用

    接上文 QT从入门到实战x篇 xx 信号和槽1 Qt中自带的信号和槽函数的使用方法本文主要介绍如何根据自身的功能需要 创建和使用自定义信号及槽函数 先写出一个功能需求 下课后 老师触发信号 饿了 学生响应信号 请客吃饭 1 建立老师类和学生
  • jquery ztree实现下拉树形框,json数据

    公司最近的项目需要用到树形下拉框 在网上找了挺多源码 最后还是采用了zTree来实现 因为代码的移植性比较高 而且数据的获取比较容易 废话不多说 直接上代码 index jsp
  • 轻量应用服务器腾讯云和阿里云哪家更好?

    轻量应用服务器阿里云和腾讯云哪个好 云服务器吧认为腾讯云轻量应用服务器还不错 腾讯云轻量服务器30元起 配置可选2核2G3M 2核2G4M 2核4G5M 4核8G12M 8核16G18M和16核32G28M 阿里云轻量应用服务器配置仅可以选
  • C语言函数大全-- w 开头的函数(1)

    w 开头的函数 1 1 wcscat 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wcschr 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wcscmp 3 1 函数说明 3 2 演示示例 3 3 运行结果 4
  • AHB接口总线仲裁1主多从细节。关于hready in和hready out信号的理解

    所有slaver 只要有1个hready out等于0 表示slaver没有准备好执行此拍操作 这时 所有slaver都不能执行此拍操作 以防止1主多从的AHB接口协议问题 所有slaver的hreadyout 需要与之后 提供给所有sla
  • linux下c++操作MySQL

    第一步 先在Linux中安装MySQL 第二步 在安装连接器 中端命令 sudo apt get install libmysqlclient dev 第三步写一个操作MySQL的c 代码保存退出 include
  • allegro如何对差分对单根网络进行等长调节

    选中要调整的差分线 再点击左栏的快捷按钮 此时options会弹出相关的调整s参数 设置好差分线参数 鼠标放在刚才选中的线上拉出一个方框 方框内就会显示线的形状变化 再次点击鼠标后 就会把线绘制成曲线形状 蛇形走线 在这里注意 如果调整走线
  • Redis缓存穿透, 击穿, 雪崩

    缓存穿透 缓存穿透是指用户想要查询一个数据 发现redis内存中没有 也就是没有缓存命中 于是向持久层数据库查询 发现也没有 于是本次查询失败 当用户很多的时候 缓存中都没有 于是都去请求持久层数据库 这会给持久层数据库造成很大压力 这就是