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