redis缓存雪崩、缓存穿透、缓存并发、缓存预热、缓存降级讲解
缓存雪崩
- 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查询数据库
导致数据库CPU和内存负载过高,甚至数据库服务器挂掉
如何预防缓存雪崩
- 缓存的高可用性
- 缓存降级: 缓存降级指的是缓存失效或者缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或者服务的内存数据
降级一般是有损的操作,所以尽量减少降级对业务的影响程度 - redis备份和快速预热
- 提前演练
缓存穿透
- 缓存穿透是指查询一个不存在的数据,例如从缓存redis没有命中,需要从mysql数据库查,查不到数据则不写入缓存
这将导致这个不存在的数据每次请求都会去从数据库查,造成缓存穿透
如何解决缓存穿透
- 缓存redis没有命中,如果查询数据库也为空,直接设置一个默认值存放到缓存,
这样第二次到缓存中获取就有值了,而不会继续访问数据库,
设置一个过期时间或者当有值的时候将缓存中的值替换掉即可
缓存并发
- 这里的并发指的是多个redis client同时set key引起的并发问题,redis本身其实是单线程的
多个client并发操作,按照先到先执行的原则,先到的先执行,其余的堵塞。
另外的解决方案是把redis.set操作放到队列中使其串行化,必须得一个一个执行
缓存预热
- 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统
这样就可以避免用户在请求的时候,先查询数据库,在写到缓存系统,用户可以直接查询事先被预热的缓存数据
缓存预热解决思路
- 直接写个缓存刷新页面,上线时手工操作
- 数据量不大,可以在项目启动的时候自动进行加载
缓存降级
- 当缓存系统挂掉后,会有大量的请求访问数据库,我们可以使用缓存降级不去访问数据库,直接返回默认值或者服务内的缓存数据,
缓存降级对应用是有损的,对业务应用系统中不核心的缓存数据才能使用缓存降级
以上就是缓存雪崩、缓存穿透、缓存并发、缓存预热、缓存降级的大致讲解。