缓存雪崩
- 缓存雪崩是指带短时间内, 有大量的缓存过期, 从而导致大量的请求直接查询数据库, 从而对数据库造成了巨大的压力, 严重情况下可能导致数据库的宕机, 这种情况称之为缓存雪崩
解决方案
- 不要让大量的缓存同时过期(设置固定过期时间+随机过期时间)
- 加锁让大量请求排队访问 不推荐
- 设置二级缓存
缓存穿透
- 缓存穿透是指在查询数据的时候, 因为数据库是没有数据的所以缓存也是没有数据的, 但是每个请求还是先回去访问缓存, 每一次都不长记性,老是问他你有么有数据, 缓存说了没有, 然后还不死心的去数据库中查询, 这种情况就叫缓存穿透
解决方案
- 无论是否有数据, 都将结果缓存起来
缓存击穿
- 缓存击穿与缓存穿透很容易混淆, 你要看字眼, 击穿 , 一击致命, 表示在一个点上导致的缓存出现问题, 也就是在缓存中某一个热点数据上, 当大量的请求还是同时访问它的时候, 不巧它突然过期了失效了, 此时这些大量的请求只能都去数据库中访问, 这样还是给数据库造成了巨大的压力, 这种情况就叫缓存击穿
解决方案
- 加锁让大量请求排队方案 不推荐 影响用户体验
- 让热点缓存永不过期
缓存预热
- 正确来说, 缓存预热不是一个缓存的问题, 而是在优化缓存的一个方案, 它可以提高用户的使用体验
- 缓存预热指的是在Redis启动时, 事先就把查询的结果方法缓存中, 一遍用户查询这些数据的时候可以直接从缓存中拿, 节约用户等待的时间.
实现缓存预热的三个思路
- 把需要缓存的方法写在系统初始化的方法中, 只有在系统启动的时候就会自动加载数据库中的数据并缓存这些数据
- 把需要缓存的方法挂载到某个页面或后端的接口上, 调用接口就可以触发缓存预热
- 设置定时任务, 到时间后自动进行缓存预热