一文了解什么是缓存击穿、缓存雪崩、缓存穿透

前言

我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中,所以当业务系统对数据库进行频繁的增删改查时。将会给数据库带来巨大的I/O压力,因此需要数据库缓存技术来实现数据的高速缓存,减少数据库的压力,但是数据库缓存也会带来一系列问题,本文就缓存数据库及其带来的几个典型问题进行一个简单的阐述。


正文

1、为什么要使用缓存数据库


1.1 减少数据库压力

以redis为例,因为数据库缓存存在于内存中,这本身就保证了数据的访问速度大大优于磁盘IO,其次,redis中保存的是数据库中常访问的数据,当客户端发起一个查询请求时,先到redis查询,redis中没有,再到数据库中查询,然后再将数据写入redis缓存,并返回响应。这样就使得客户端的访问不会大量冲击数据库,造成数据库崩溃。

1.2 提高数据访问速度

我们知道,就寻址速度而言,磁盘是ms级的,内存是nm级的,内存的寻址速度是磁盘的10w倍,如果不加缓存,那么用户的请求将直接访问磁盘,这样就导致系统的响应速度变慢,如果访问量再增大,那么有些访问请求就可能超时,导致用户体验变差。而加了缓存,用户的请求就先从内存中查询,大大减少了响应时间,特别是对于一些热点数据,redis更是能发挥它的作用。

1.3 提高系统并发量

数据显示,当单机的mysql并发量达到1秒2K时,就可能导致崩溃,而海量数据或者热点数据并发量远远不止这个数,而使用缓存,可以使单机的并发量提高到1万甚至几十万,原因就在于内存对高并发的支持。redis通过主从架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。如果缓存要容纳的数据量很大,达到了几十g,甚至几百g,或者是几t,那么就需要redis集群,使用redis集群之后,可以提供可能每秒几十万的读写并发。

2、缓存数据库带来的三个经典问题


2.1 缓存击穿

缓存中没有但是数据库有的数据,如果此时用户并发量特别大,而缓存中又没有这条数据,那么大量的用户请求就会直接冲击数据库,造成数据库崩溃,可能的原因是热点数据缓存过期
缓存雪崩


解决方案:

  1. 加互斥锁,当缓存中没有该数据时,获取互斥锁,进入数据库读取数据,其他线程等待获取锁。
  2. 提前预估热点数据过期时间,定期更新,保证热点数据不过期。
  3. 设置热点数据缓存永不过期。
  4. 使用布隆过滤器对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器,如果发现不在集合中,就直接丢弃,不再对持久层查询。

2.2 缓存雪崩

缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库
缓存雪崩


解决办法

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。

2.3 缓存穿透

缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
在这里插入图片描述


解决办法

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  2. 缓存空对象。当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值