1、缓存穿透
缓存穿透是指用户发出一大波不在缓存也不在数据库中的数据请求,这种请求会造成数据库的访问压力过大。
解决方案
- 利用互斥锁,如果缓存中没有数据,先获得锁,获得锁之后再访问数据库,没得到锁就休眠一段时间再重试
- 异步更新,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
- 在接口层对不合法的用户id进行过滤,在上游进行拦截。或者通过布隆过滤器来拦截黑客请求。
2、缓存击穿
缓存击穿是值缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案
- 和缓存穿透一样,在读数据库的时候加锁。
- 设置热点数据永不过期
3、缓存雪崩
缓存雪崩是指同一时间大面积缓存失效,而这个时候用户的访问都会从数据库中读数据
解决方案
- 热点数据永不过期
- 缓存数据的过期时间随机设置,避免同一时间大面积失效
- 访问数据库的时候加互斥锁