一、缓存穿透

1 什么是缓存穿透

缓存穿透是指查询一个在redis和DB中都不存在的数据,redis中查不到去DB查,DB查不到则不写入redis,导致每次查询这个数据都要穿过redis穿透到DB

2 缓存穿透产生的情况

1) 业务不合理的设计

2) 误操作: 误删除了redis和DB中的数据

3) 黑客非法请求攻击: 故意捏造大量非法请求读取不存在的业务数据

3 解决措施

缓存穿透是不可能自动恢复的

1) 设置空值或默认值

查询DB为空,可以给缓存设置个空值或者默认值写入redis,同时设置一个过期时间

2) 布隆过滤器

a) 将数据库所有的数据加载到布隆过滤器

b) 当有请求时先去布隆过滤器查询,判断查询的数据是否存在

c) 如果判断数据不存在,那么直接返回空给客户端

d) 如果判断数据存在,那么则查询缓存或DB

e) 将DB中查询的结果返回给客户端,并且缓存到 Redis 中

二、缓存击穿

1 什么是缓存击穿

缓存击穿是指热点key在过期失效的瞬间,大量请求穿过了redis直接访问DB

严重的情况甚至会造成DB服务宕机

2 解决措施

1) 热点数据永不过期

2) 加锁

保证每个热点key同时只有一个线程去查询,其它线程会被阻塞,等锁释放开,缓存已有了数据,其它线程就不必访问DB,这会影响服务的高并发量

三、缓存雪崩

1 什么是缓存雪崩

缓存雪崩是指redis中大量key过期或者redis宕机,导致请求直接访问DB,引起DB压力过大甚至宕机

2 解决措施

1) 随机分散过期时间

2) 限流降级: 缓存失效后,通过加锁或队列来控制读取DB且写入redis的线程数量

3) 熔断:暂停缓存访问待实例恢复,返回预定义信息(错误页面或空值等信息)

4) 配置 redis 高可用集群

四、三个缓存问题之间的区别

缓存击穿是热点key过期失效的瞬间,有大量的请求穿过了redis直接访问DB

缓存穿透是请求查询不存在key,穿过了redis直接访问DB

缓存雪崩是大量key同一时间过期或者redis宕机,请求穿过了redis请求直接访问DB

缓存击穿、缓存雪崩都是DB中有数据,但redis中没有,是可以自动恢复的;缓存穿透是redis和DB都没有数据,不可能自动恢复的

最新文章

  1. 每天成长一点---WEB前端学习入门笔记
  2. Linux shell ”Press any key to continue ”功能实现
  3. MVC5-1 ASP.NET的管道流
  4. java继承内部类问题(java编程思想笔记)
  5. 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)
  6. zoj 3672 Gao The Sequence
  7. mongodb与mysql相比的优缺点
  8. 转 C语言面试题大汇总
  9. RMAN备份介质的移动与再恢复测试 [ catalog start with ‘dir’ ]
  10. Git添加远程库和从远程库中获取
  11. GIT入门笔记(5)- 创建版本库
  12. 什么是,session、cookies、token
  13. 【转载】Window服务器开机后一直处于蓝色屏幕(非蓝屏 crash)状态
  14. Java编程思想 学习笔记1
  15. ASS字幕制作和压制教程
  16. Linux下Redis的安装与启动
  17. POJ 2243 Knight Moves(BFS)
  18. delphi 合并两个 Wav 文件流的函数
  19. 人脸识别 ArcFace Demo [Windows]
  20. Delphi 连接 Paradox

热门文章

  1. Telerik GridView ----Pdf
  2. Docker私服(Registry)
  3. Web开发的常用攻击和防御方式
  4. TCP三次握手四次挥手内容及步骤
  5. wsl2 的安装与使用
  6. 可收集ALC问题[A non-collectible assembly may not reference a collectible assembly.]
  7. 基于Mybatis Plus的一种查询条件构建方案
  8. 【Python实例】用脚本自动拿一个或多个仿真环境
  9. Hyper-v 安装openwrt
  10. java中post推送json格式字符串