缓存击穿:是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库
缓存雪崩:缓存雪崩是因为大面积的缓存失效,打崩了DB。
缓存穿透:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。
Redis雪崩效应的解决方案
- 分布式锁(本地锁)
对数据库服务请求进行限制,使用锁机制,保证只有一个线程进行数据库的操作访问,多的直接排队等待,(单本版本可以用本地锁ReentrantLock,集群服务使用分布式锁),可以解决雪崩效应,但会影响吞量。
- 使用消息中间方式
通过消息中间件让访问排队,加载缓存,只要不让并发一下子全部打在数据库上面,就好办,效果是第一次访问返回空数据,刷新或刷新几次后展示数据
使用数据库的二级缓存,使用ehcache实现二级缓存
均摊分配redis key的失效时间,只要不要集中在一点就好,以几分钟的随机数让缓存错峰失效
多缓存并用,可以用多个缓存, 如redis缓存和memcache缓存并用,或者部署两套redis集群。
通过限流等手段
缓存穿透的解决方案
- 定义参数规则,如果参数不符合规则直接抛异常,常见的如对外提供的接口,参数应该是大于0的,如果一直传小于等于0的参数,直接返回错误
- 数据库中查不到数据的时候,向缓存放一个空对象,再从缓存中获取数据,获取的就是空对象从而不继续走库
缓存击穿的解决方案
限流