Redis-缓存击穿、穿透的应对策略

为了防止大量的请求向数据库发送我们通常使用Redis对一些重复的数据进行缓存,仅仅只让那些Redis缓存中没有的数据连接数据库并更新Redis中的数据。

就是这个缓存模型看起来好像很简单,但是深究细节还是有很多地方可以操作。如果只是简单使用其作为缓存便可能在实际运行中发生缓存击穿缓存雪崩缓存穿透等问题。从而导致存取的数据不一致,甚至更严重的会使数据库宕机等严重事故。

缓存穿透

Redis缓存中的数据都是以key-value的形式存储起来的,在正常的数据查询时如果查到该key在缓存中不存在就会越过Redis转而向数据库发送请求。这一简单的原理却暗藏玄机,如果一个恶心的用户利用程序大量查询一个不存在的数据,这时Redis会直接给这些数据放行,那么这么多数据全部打到我们的数据库上那就惨了啊严重点可能会让数据库直接挂掉,设置的Redis缓存就相当于没用一样。

这个时候有聪明的程序员提出了两个方法 缓存空对象布隆过滤防止缓存穿透的现象发生。

应对策略

  • 缓存空对象:客户端不是一直发送一个不存在的数据请求无视Redis吗?那现在就从Redis存储缓存的策略上来入手,将这些恶意请求阻挡在外还数据库一片清净,我们可以将这一不存在的数据作为key储存在Redis中 ,且其value为空字符串""。这样只要用户查询了一次不存在的数据,Redis就会把它缓存起来用来辨别后续大量的恶意请求,完美的解决了缓存穿透的问题。
  • 布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中

从上面两个方法分析可以看出来都是以判断对象是否存在为切入点去解决

两种策略的优缺点

  • 缓存空对象

    • 优点:实现简单,维护方便

    • 缺点:

      • 额外的内存消耗
      • 可能造成短期的不一致
  • 布隆过滤

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

    • 缺点:

      • 实现复杂
      • 存在误判可能
相关推荐
_codemonster4 分钟前
java web修改了文件和新建了文件需要注意的问题
java·开发语言·前端
Java天梯之路11 分钟前
Spring Boot 钩子全集实战(九):`@PostConstruct` 详解
java·spring boot·后端
松涛和鸣14 分钟前
75、 IMX6ULL LM75温度传感器I2C驱动开发
java·linux·数据库·驱动开发·python
独自破碎E22 分钟前
BISHI41 【模板】整除分块
java·开发语言
毕设源码-郭学长24 分钟前
【开题答辩全过程】以 基于Springboot图书管理系统为例,包含答辩的问题和答案
java·spring boot·后端
鹅是开哥44 分钟前
Spring AI Alibaba + DashScope 调用超时彻底解决(SocketTimeoutException / read timeout)
java·人工智能·spring
努力学习的小廉44 分钟前
redis学习笔记(三)—— hash数据类型
redis·笔记·学习
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于springboot网络游戏账号租赁以及出售系统为例,包含答辩的问题和答案
java·spring boot·后端
vx+_bysj68691 小时前
【免费领源码】基于Springboot白隼校园音乐点歌系统 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·spring boot·mysql·课程设计
C雨后彩虹1 小时前
跨线程数据传递InheritableThreadLocal的原理
java·多线程·同步·异步·threadlocal