缓存穿透

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护后端存储的意义。

解决方案

缓存空值

 如果访问数据库后还未命中,则把一个空的对象或默认值缓存到Redis上,之后再访问这个数据就可以在缓存中命中

优点:

  • 实现简单,维护方便

缺点:

  • 额外消耗内存
  • 可能会造成短期的数据不一致

布隆过滤

除了缓存空对象,我们还可以在存储和缓存之前,加一个布隆过滤器,做一层过滤。

布隆过滤器里会保存数据是否存在,如果判断数据不不能再,就不会访问存储。
布隆过滤器是一个连续的数据结构,每个存储位存储都是一个bit,即0或者1, 来标识数据是否存在。如果数据存在则放行,这个请求会去访问Redis,即使Redis缓存过期,请求也会在数据库中命中。假设判断数据不存在则直接返回

优点:

  • 内存占用较少,没有多余key

缺点:

  • 实现复杂
  • 存在误判可能

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案

  • 利用Redis集群提高服务的可用性
  • 给业务添加多级缓存,每一级缓存的失效时间都不同
  • 为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间随机生成,避免过期时间太过集中
  • 热点数据永不过期
  • 给缓存业务添加降级限流策略,当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案

  • 加锁更新
    查询缓存,发现缓存中不存在,加锁,让其它线程等待,只让一个线程去更新缓存。
    优点:

    • 没有额外的内存消耗
    • 保证数据一致性
    • 实现简单

    缺点:
    - 线程需要等待,性能受影响
    - 可能有死锁的风险

  • 异步更新
    我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据就会一直在内存中,我们可以采用逻辑过期方案,每次在保存值时额外增加一个逻辑过期时间,这个时间由我们自己来维护,每次拿出数据判断是否过期,如果已经过期则开一个新的线程去异步更新缓存中的数据,并先返回过期的数据
    优点:

    • 线程无需等待,性能较好

    缺点:

    • 不保证数据的一致性
    • 有额外的内存消耗
    • 实现比较复杂

什么是缓存穿透、缓存雪崩、缓存击穿相关推荐

  1. Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

    一.概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热 ...

  2. 什么是缓存穿透、雪崩、击穿以及解决方案

    目录 1.缓存穿透 2.缓存雪崩 3.缓存击穿 4.区别总结 5.加锁实现 1.缓存穿透 描述: 在查询一个数据时,在缓存中不存在,将去数据库进行查询并且数据库中也不存在数据,使得缓存中一直不会存在数 ...

  3. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

    对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣 ​ ​ redis缓存穿透 ​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据 ...

  4. 缓存穿透、雪崩、击穿的区分

    缓存穿透: 是指用户查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去 ...

  5. 一篇吃透Redis缓存穿透、雪崩、击穿问题

    前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...

  6. Redis11_缓存穿透和雪崩

    Redis11_缓存穿透和雪崩 缓存穿透 用户查询某个数据时,会先在redis缓存中查询,如果缓存没有命中,会去持久层数据库MySQL中查询,如果此时依然没有命中,将返回null,不会写入缓存. 当同 ...

  7. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)

    Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...

  8. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  9. 常说的「缓存穿透」和「击穿」是什么

    作者 | 鄙人薛某  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | 鄙人薛某(ID:gh_4c2f29048530) 对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是 ...

  10. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

最新文章

  1. 白盒测试各种“覆盖”间的拓扑关系及白盒用例常用要求
  2. [代码笔记]VUE路由根据返回状态判断添加响应拦截器
  3. Java Web的Struts2的多语种网站的多语言切换实例
  4. 把数据自动填入exe的输入框_2000余字长文讲解Excel中的“数据验证”,我收藏了...
  5. 使用OSOT来优化虚拟桌面2
  6. 提高Java架构师和程序员效率的10个工具
  7. linux仿真速度快吗,Linux上安装使用最快的GPU加速的终端仿真器Alacritty
  8. 【转】最为详尽的WPF类继承关系*!
  9. python添加环境变量_windows系统下python学习-1 (python环境变量配置)
  10. poj 1466 Girls and Boys (最大独立集)
  11. linux 下串口转usb不能发送数据包,红帽redhat下 串口转USB问题 linux
  12. Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群
  13. python2与python3在windows下共存
  14. oracle实现主键自增长及自动生成策略
  15. Flume 知识点总结
  16. CWRU滚动轴承数据集简介
  17. 如何保证战略落地_【管理前沿】保障战略规划落地的三大措施
  18. android 怎样删除sim卡中的联系人
  19. DPDK-RSS负载均衡分流
  20. chrome 浏览器 console 加入 jquery 测试调试 一介布衣

热门文章

  1. linux 查看mmc分区_查看MTD,EMMC,MMC三种设备的分区
  2. 如何用微信朋友圈引起客户注意?
  3. uni-app小程序使用小程序码绑定用户信息合成海报
  4. 记录秋招服务器开发面经(游戏服务器)
  5. 【CTF】梦之光芒/Monyer的游戏闯关记录
  6. “Elasticsearch + Kibana + ik分词器“介绍与使用
  7. python绘图之使用matplotlib连接两个点
  8. 游戏中常见的漏洞和预防措施
  9. 最新ThinkPHP开发仿百度钱包源码红色优享钱包源码/接入第三方认证,去后门修复缺陷
  10. 用Latex写毕业论文-- 用 ctexset 重定义标题(如:第一章)