生产Redis高并发下缓存不一致解决方案
2021-11-29 20:37:01 0 举报
如果项目要求强一致的缓存一致性必须考虑串行化接口服务
作者其他创作
大纲/内容
数据一致性方案--异步串行化服务统一key进行先写后读顺序排序
顺序1
queue1
根据商品id进行处理queue的路由
更新请求
库存服务负责库存DB操作
读请求
queue2
读key1
同一id的请求会路由到同一个queue里
由于这里的读要么是直接读redis库存,如果redis里没有,那么这里的读其实只是起异步更新库存数量的作用那么这里有一个优化点,一个队列中,其实对于同一个key的多个更新缓存请求串在一起是没意义的,因此可以做过滤,如果发现队列中已经有一个对同一key的更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接等待前面的更新操作请求完成即可。待那个队列对应的工作线程完成了上一个操作的数据库的修改之后,才会去执行下一个操作,也就是缓存更新的操作,此时会从数据库中读取最新的值,然后写入缓存中如果请求还在等待时间范围内,不断轮询发现可以取到值了,那么就直接返回; 如果请求等待的时间超过一定时长,那么这一次直接从数据库中读取当前的旧值
数据库
顺序2
更新库存 key1
queue3
更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个jvm内部的队列中读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个jvm内部的队列中一个队列对应一个工作线程每个工作线程串行拿到对应的操作,然后一条一条的执行这样的话,一个数据变更的操作,先执行,删除缓存,然后再去更新数据库,但是还没完成更新此时如果一个读请求过来,读到了空的缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成redis请求都是微秒级别的,即使排队较多,一般来说非常快就搞定了,不会延迟太久
DB
Redis
0 条评论
下一页