一.缓存击穿
在高并发系统中,大量的请求同时查询缓存中个一个key值,如果此时这个key值正好失效了,就导致大量的请求都去访问数据库了,数据库压力剧增,这就是缓存击穿。
解决方法:
1.常用的方式就是使用互斥锁,第一个请求拿到锁,去数据库取数据,然后刷新到缓存,后面的请求就走缓存,不在请求数据库
2.设置常用的key值永不过期
二.缓存穿透
缓存穿透指用户查询一个不存在的数据(缓存和数据库中都没有),如果多个请求一直查询一个不存在的数据,会导致每次请求都会去查询数据库,因为一般的缓存策略是数据库中有数据,才会刷新到缓存,这也会导致数据库压力骤增,也容易被恶意者利用来攻击数据库。
解决方法:
1.如果一个请求从数据库查询一条不存在的数据时,返回空值,并将空值刷新到缓存,同时设置一个过期时间。这样当下一个请求再去查询这个key时,就会从缓存中拿。
2.采用布隆过滤器
将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对数据库的压力
三.缓存雪崩
是指一段时间内大量的key值都失效了,发生大量的缓存穿透,所有查询都落在数据库上了,数据压力过大甚至宕机。这就是缓存雪崩
解决方法:
1).数据预热,就是系统上线后,将相关的缓存数据直接刷新到缓存中,这样就可以避免用户请求先查数据库。可以通过缓存Reload机制,预热刷新缓存
2).双缓存策略,C1为原始缓存,C2为拷贝缓存,C1失效时,可以访 问C2,C1缓存失效时间设置为短期,C2设置为长期。
3).key值的过期时间设置为随机,防止同一时间大量的数据过期
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。