SpringCache 解决缓存常见问题
- 1 缓存穿透
- 2 缓存雪崩
- 3 缓存击穿
1 缓存穿透
缓存穿透是指缓存和数据库中都没有数据,而用户不断发起请求则这些请求会穿过缓存直接访问数据库,如发起为id为“-1”的数据或id为特别大不存在的数据。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。
解决方案:
-
缓存空对象:当存储层不命中时,创建空对象并将其缓存起来,同时会设置一个过期时间(避免空值占用更多的存储空间),之后再访问这个数据将会从缓存中获取,保护了后端数据源;
-
布隆过滤器
对所有可能对应数据为空的 key 进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。
2 缓存雪崩
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
解决方案:
- 批量构建缓存时,为缓存设置不同的有效期
- 保证缓存服务器的高可用
3 缓存击穿
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对一个key不停进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案:
-
设置热点数据永不过期
-
使用互斥锁
只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可。