单机缓存_缓存三大问题深入浅出

本文深入探讨了分布式系统中缓存雪崩、缓存击穿和缓存穿透问题,阐述了它们的原因和影响,并提出了相应的解决方案,如设置随机过期时间、使用互斥锁、空值缓存和布隆过滤器等。总结了理解和解决这些问题的重要性,旨在帮助读者在实际工作中更好地应对缓存挑战。
摘要由CSDN通过智能技术生成

0. 说明

缓存在计算机中是一种被广泛使用的策略,包括单机的计算机体系,通过CPU+内存+硬盘的方式实现,基本上硬盘的存储空间却近似内存的访问速度,这里内存就是CPU和硬盘之间的缓存。而PC中出现的一级缓存,二级缓存,是内存和CPU之间的缓存,这样可以使得PC享受内存的空间大小,接近CPU高速缓存的访问速度。而本文主要是介绍在分布式系统中的缓存。我们先看下流程图:

280d91709a920a02ea5d3c5a0d6ea8b9.png

分布式缓存

这里缓存的作用是加快显示数据的速度,减少访问DB的请求,从而减少DB的压力。当然在不同的系统中可能不是仅仅减少DB的压力。

但是在分布式系统中最容易出现三种问题,分别是缓存雪崩、缓存穿透、缓存击穿。下面我们分别对这三种问题做解释,并简单介绍下解决方案。

1. 缓存雪崩

缓存雪崩是指在某一时刻缓存突然不可用,然后所有的请求都定向的DB,可能会拖死DB。这里的突然不可用,包括获得缓存的值为null或者报错。导致这种现象的原因是突然间大量的缓存过期失效,或者是缓存服务器挂了,服务不可用等。

解决的方案:

  • 1. 热点数据永不过期,不设置过期时间
  • 2. 访问加锁,类似wait和notify方法,同一时刻只能一个key访问数据库,类似访问队列。
  • 3. 数据过期时间设置随机性,这个笔者的理解是,对于预热的数据可以随机的设置过期时间,对于在运行过程中插入的缓存,因为大多都是随机时间插入,可以设置为固定的时间。
  • 4. 使用redis集群的方式实现高可用,这个是针对宕机的情况。
  • 5. 可以加入多级缓存,这个也是主要针对宕机的情况。多一次请求。

2. 缓存击穿

缓存击穿是针对的获得缓存数据没有,但是换的DB数据有,而且是某一时刻大量的这样的请求,有点类似缓存雪崩的一种情况。类似的场景就是一直都访问某些key,在某一个时间点这些key都过期了,所以这些key就要再次从数据库中得到。

解决的方案:

  • 1. 热点数据永不过期,不设置过期时间
  • 2. 访问加锁,加互斥锁。
  • 3. 数据过期时间设置随机性,这个笔者的理解是,对于预热的数据可以随机的设置过期时间,对于在运行过程中插入的缓存,因为大多都是随机时间插入,可以设置为固定的时间。

3. 缓存穿透

缓存穿透顾名思义就是,穿透缓存,将请求打到DB上去。主要是应对恶意攻击者,故意的请求缓存中没有且DB中也没有的数据,类似于DOS攻击,拖垮DB或者减慢DB的正常业务的处理。

解决的方案:

  • 1. 前端接口进行参数校验,过滤不合理的数据请求。
  • 2. 空值也可以做缓存, 设置过期时间短一点,在一个可接受的范围内,时间不能过长,万一key是合理的,在未来不久的时间内会被正确的使用,那就会影响业务,这点要处理好。
  • 3. 设置key的规则,对于不合理的key直接在程序中控制
  • 4. 布隆过滤器,bitmap(位图)

4. 总结

缓存中的这三个问题,也是一般程序员面试中经常被问到的问题,但是理解的流程基本上都不难,上面是简单介绍了这三个问题,并列举了几个结果方案。希望对读者在工作学习中有所帮助。其实缓存还是有很多问题,基本上这些问题在分布式中都会存在,包括缓存失效还是更新,先缓存还是先DB等问题,这留给以后的文章中详细介绍。谢谢阅读!

求**评论、点赞、关注+转发**

限于笔者知识有限,如果不足之处请帮忙指正,不喜勿喷!

您的支持是我不懈努力的动力,请读者多支持下!

更多文章,请关注微信公众号 CS_Toper之路,或者头条号 CSToper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值