数据库与redis缓存双写数据不一致方案
数据库与缓存不一致只有在出现并发读写时才会出现,如果每天上亿的流量,每秒并发读是几万,每秒只要有更新缓存的请求,
就很可能会发生数据库与缓存不一致的情况。
解决方案。
1、简单方案 先更新数据库,再删除缓存, 延时再删除缓存。
2、数据库和缓存更新读取异步串行化
更新数据的时候,根据数据的唯一标识,将操作路由后,发送到一个jvm内部队列,读取数据的时候,如果发现数据不在缓存中,那么将读取数据操作,
根据数据的唯一标识,将操作路由发送到相同jvm的内部队列,一个队列对应一个工作线程,每个工作线程串行执行一条条请求数据,这样的化一个变更操作,先执行更新数据库,再删除缓存,
在变更操作没有执行完之前,一个读请求将在队列中积压,自悬等待更新操作完成,如果在预期时间范围内更新完成,则返回,如果超时,则从数据库中读取返回,
队列可以优化同时多个更新请求,只积压一个。
方案缺点
1、读请求长时阻塞
2、读请求并发量过高
3、多服务器实例部署的请求路由
4、热点商品的请求路由问题,导致数据倾斜
1、线程池加内存队列,通过listener进行初始化。单例线程池
2、两种请求对象封装。
3、请求异步执行封装
4、两种请求Controller封装
5、读请求去重优化
6、空数据请求过滤优化



