redis三大缓存问题探究

好久没更新辣,来一篇~redis

在redis缓存中必须要知道的三个概念,也是面试常问:

  1. 缓存穿透
  2. 缓存击穿
  3. 缓存雪崩

那么什么是缓存穿透呢?

通俗易懂的讲,就是指当用户查询一条数据的时候,而此时数据库和redis中没有这条数据的任何信息,而这条数据在redis中没有找到就回去数据库查询请求,获取数据。当它拿不到数据的时候,是会一直查询数据库,这样就会对数据库造成很大压力

举个栗子:用户查询一个 id = -1 的商品信息,一般数据库 id 值都是从 1 开始自增,很明显这条信息是不在数据库中,当没有信息返回时,会一直向数据库查询,给当前数据库的造成很大的访问压力

这时候我们要想一想,该如何解决这个问题呢?o(╥﹏╥)o

一般我们可以想到从缓存开始出发,想如果我们给缓存设置一个如果当前数据库不存在的信息,把它缓存成一个空对象,返回给用户。

没错,这是一个解决方案,也就是我们常说的缓存空对象(代码维护简单,但是效果不是很好)

缓存空对象

缓存空对象它就是指一个请求发送过来,如果此时缓存中和数据库都不存在这个请求所要查询的相关信息,那么数据库就会返回一个空对象,并将这个空对象和请求关联起来存到缓存中,当下次还是这个请求过来的时候,这时缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能

我们可以看下下面的这个流程图:
在这里插入图片描述
在这里插入图片描述
这时候,我们就会问了 ,如果大量不存在的请求过来,那么这时候缓存岂不是会缓存许多空对象了吗~~~如果时间一长这样会导致缓存中存在大量空对象,这样不仅会占用许多的内存空间,还会浪费许多资源

确实是这样,但是我们可以解决这个问题,在redis中提供了过期时间的命令,这样我们可以在设置空对象的时间,顺便设置一个过期时间

在Java 中直接调用 API 操作即可:

redisCache.put(Integer.toString(id), null, 60) //过期时间为 60s

还有一种解决方案,就是布隆过滤器,但是维护比较复杂,就不多讲了,想要了解的也可以去查资料了解o

缓存击穿

缓存击穿是指某个key经常被查询,经常被用户特殊关怀,用户非常 love 它,也就类比“熟客” 或者 一个key经常不被访问。但是这时候,如果这个key在缓存的过期时间失效的时候或者这是个冷门key时,这时候突然有大量有关这个key的访问请求,这样会导致大并发请求直接穿透缓存,请求数据库,瞬间对数据库的访问压力增大

归纳起来:造成缓存击穿的原因有两个:

  1. 一个“冷门”key,突然被大量用户请求访问
  2. 一个“热门”key,在缓存中时间恰好过期,这时有大量用户来进行访问

在这里插入图片描述
在这里插入图片描述
解决方案:
分两种情况吧,如果实在单机项目下,我们可以加锁就可以解决(如:Lock、Synchronized等)
如果是在分布式环境下,就分布式锁吧,这一个我也不是很了解哦😁

之后的效果:
在这里插入图片描述

缓存雪崩

缓存雪崩是指在某一个时间段内,缓存集中过期失效,如果这个时间段内有大量请求,而查询数据量巨大,所有的请求都会达到存储层,存储层的调用量会暴增,引起数据库压力过大甚至宕机
原因:

  1. Redis突然宕机
  2. 大部分数据失效

一样一样,举个栗子:比如我们基本上都经历过购物狂欢节,假设商家举办 23:00-24:00 商品打骨折促销活动。程序在设计的时候,在 23:00 把商家打骨折的商品放到缓存中,并通过redis的设置了过期时间为1小时。这个时间段许多用户访问这些商品信息、购买等等。但是刚好到了24:00点的时候,恰好还有许多用户在访问这些商品,这时候对这些商品的访问都会落到数据库上,导致数据库要抗住巨大的压力,稍有不慎会导致,数据库直接宕机(over)

在这里插入图片描述
当缓存GG(失效)的时候却是这样的:
在这里插入图片描述
对于缓存雪崩有以下几种解决方案:

  1. redis高可用(没试过)
    redis有可能挂掉,多增加几台redis实例,(一主多从或者多主多从),这样一台挂掉之后其他的还可以继续工作,就是搭建的集群
  2. 限流降级
    在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个key只允许一个线程查询数据和写缓存,其他线程 等待
  3. 数据预热
    数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key
  4. 不同的过期时间
    设置不同的过期时间,让缓存失效的时间点尽量均匀

不行了肝不动了,就到这里了,先睡为敬,23点19分,晚安!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值