缓存穿透
什么是缓存穿透?
缓存穿透是指查询的数据,在redis数据库中没有,也就是缓存未命中,然后去到持久层数据库中查询,数据还是没有,然后当大量查询空数据的情况出现,会给持久层数据库造成巨大的压力,就会造成缓存穿透的情况。(相当于一直查询没有的空数据)
如何解决缓存穿透?
1.使用布隆过滤器
布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
2.缓存空对象
即使在数据库中没有查询到数据,也给缓存设置个空值,设置一个比较短的过期时间,防止同一时间内多次查询一个不存在的数据来攻击的情况。
但是存在两个问题:
- 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多值为空的键
- 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
缓存击穿
什么是缓存击穿?
缓存击穿指高热点的数据,大量的查询请求查询高热点数据,当高热点的缓存数据过期的一瞬间,在高并发的情况下,大量请求去访问持久层数据库来查询该数据,造成数据库压力过大,造成缓存击穿。
(与缓存穿透不同的地方在于,这是相当于一个点,而且这个是能在持久层数据库查询到,而缓存穿透在持久层数据库也无法查询到。)
如何解决缓存穿透?
- 设置热点数据永不过期
- 加互斥锁,可以使用分布式锁,保证一个key同时只有一个线程去查询,将高并发的压力转移到分布式锁,对分布式锁的要求很高。
缓存雪崩
什么是缓存雪崩?
缓存雪崩是指在同一时刻内,大量的缓存数据同时过期,导致一堆各种查询请求直接到数据库,造成数据库压力过大,也有一种是因为缓存服务器宕机造成,一瞬间将数据库压垮,这种更加严重。
如何解决缓存雪崩?
- 搭建redis集群,保证redis的高可用,一台宕机后另一台快速补上
- 同样可以加互斥锁,使一个key同时只有一个线程访问
- 键的过期时间尽量保持一个随机性,防止同一时刻内大量过期,让过期的时间点尽量均匀