缓存击穿:
定义:缓存中的key一般设有过期时间,如果某一个key过期了,就在这个时候,有大量的并发请求访问这个key,则这些请求会直接到DB,导致DB瞬间的压力过大,压垮DB
解决方案:
- 设置互斥锁,当缓存失效的时候不是立即去访问数据库,而是使用缓存工具的操作成功带回返回值的操作,比如redis的setnx(set if not exit)
- 提前使用互斥锁,分别给redis和数据的超时时间
- 设置数据永远不过期
缓存穿透:
定义:指有人用用具库中不存在某个key访问,数据库中没有这个key值,自然缓存中也没有,改请求直接到数据库,如果key的访问量很大,就会压垮数据库。
解决办法:
- 对查出结果为空的key,也在缓存中建了一个key - value对,只是过期时间设置的短一些。
缓存雪崩:
定义:指缓存中大量的数据在同一时间失效,这是就会有大量的请求直接到数据库,造成数据库压力过大。
解决办法:
- 错开失效时间
- 加锁,加队列,如MQ,存放在队列中,慢慢处理。