1.缓存和数据库的双写一致性问题

如果有缓存,那么就从缓存中完成查询操作了,所以一定要保证缓存中的数据和数据库中的数据是一致的。

解决的方案:

1.写一个接口,每次做写操作的时候,删除缓存中对应的数据。这样做耦合度高,也有可能会出现接口调用失败的情况。

2.使用消息中间件。

 

2.缓存的并发竞争问题

多个子系统同事去set一个key。

解决方案:

1.做一个分布式锁。

 

3.缓存雪崩

缓存同一时间大面积失效,这个时候来了一波请求,直接怼到了数据库上。

结局方案:

1.给不同的缓存设置不同的失效时间,让他们有随机性。

2.使用互斥锁,但是会导致吞吐量的下降。

3.搭建Redis集群。

 

4.缓存击穿问题

故意去请求缓存中不存在的问题,会导致请求全怼到数据库上。

解决方法:

1.使用互斥锁,缓存失效的时候,先去获取锁。有锁去请求数据库,没锁就休眠一段时间重试。

2.采用异步更新的策略,不管有没有取到key对应的value,都返回结果。也就是异步起一个线程去数据库中更新缓存。