1. 缓存穿透
要查询的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
解决方式:
1.布隆过滤器。原理就是对库里所有的数据通过同一组hash算法散列到一个bitmap0里,对于一个新元素,它经过该组hash算法之后的得到的bitmap1中,如果有一个bitmap0对应位是0的位为1,那么该元素一定不存在数据库里。所以当布隆过滤器判断出该元素不在数据库里的时候是不会误判的,然而它不能确定该元素是否真的在库里。
2.将查出来是null的结果Key也缓存到redis里,设置一个较短的过期时间。
2. 缓存击穿
某一个key的缓存过期时,大量对数据库的访问对数据库会造成很大的压力。
解决方式:
采用锁(java内置锁或分布式锁)的方式进行同步。
先从redis里拿数据,如果有数据直接返回,如果没有,加锁。如果拿到锁,到库里拿数据塞到redis里然后解锁。如果没拿到锁,等待一小段时间后再次重复上述步骤。
3. 缓存雪崩
当多个redis key都失效,例如redis重启或者大量缓存在同一时间失效时,大量的访问也会对数据库造成很大压力。区别于缓存击穿的就是雪崩是很多个key失效,击穿是1个key失效。
解决方法:
- 加锁限制数据库的并发量,但是会影响效率。
- 为key设置不同的缓存失效时间
- 设置缓存过期标志,缓存快过期时去刷新缓存
网友评论