1.缓存和数据库的双写一致性问题
如果有缓存,那么就从缓存中完成查询操作了,所以一定要保证缓存中的数据和数据库中的数据是一致的。
解决的方案:
1.写一个接口,每次做写操作的时候,删除缓存中对应的数据。这样做耦合度高,也有可能会出现接口调用失败的情况。
2.使用消息中间件。
2.缓存的并发竞争问题
多个子系统同事去set一个key。
解决方案:
1.做一个分布式锁。
3.缓存雪崩
缓存同一时间大面积失效,这个时候来了一波请求,直接怼到了数据库上。
结局方案:
1.给不同的缓存设置不同的失效时间,让他们有随机性。
2.使用互斥锁,但是会导致吞吐量的下降。
3.搭建Redis集群。
4.缓存击穿问题
故意去请求缓存中不存在的问题,会导致请求全怼到数据库上。
解决方法:
1.使用互斥锁,缓存失效的时候,先去获取锁。有锁去请求数据库,没锁就休眠一段时间重试。
2.采用异步更新的策略,不管有没有取到key对应的value,都返回结果。也就是异步起一个线程去数据库中更新缓存。