03_数据库和缓存双写不一致问题及解决方案
2020-02-22 21:49:46 39 举报
数据库和缓存双写不一致问题及解决方案
作者其他创作
大纲/内容
1、将A商品的库存量减1
说明:缓存是空的有两种情况,一种情况是数据库里压根就没有这条数据,这个时候可以去判断,内存队列里有没有更新操作,如果没有更新操作,说明这条数据压根就是空的,那么不用hang住直接返回null。如果内存队列有这个商品的更新操作,那就需要去hang一会,去等待那个操作快速完成,返回返回。
client
读写并发时复杂的数据库和缓存双写不一致问题
4、查询A商品库存
库存服务
数据库和缓存双写不一致问题
优化的点:如果短时内有多个读A商品库存的请求,读到缓存为空,则都会跑到内存队列中去。其实这里没有必要再往队列中去压了,可以先进行判断一下,看是否有同样的读操作了。这些相同的请求可以在系统中hang 200毫秒,每隔20ms到缓存中查询,如果在200毫秒内从缓存读到数据则返回,如果读不到直接去数据库查询,返回数据库中的值。
路由器
数据库和缓存双写不一致问题解决方案
内存队列
A商品库存:1000
数据库
5、从缓存中未查询到
缓存
路由器说明:路由器根据商品Id进行hash,把同一个商品Id的读写操作同一个队列中。
后台线程说明:一个内存队列对应一个后台线程,每个线程从一个队列中去消费请求操作。
7、此时完成了修改库存等于999的操作。这样就出现以数据和缓存双写不一致。
6操作请求
2操作请求
3、在数据库将库存减1、修成999,修改失败。
6、从数据查询到A商品库存还是为1000,并将1000更新到缓存
3、尝试去删除A商品库存,缓存就空了,下一次读缓存时就读不到数据了,就会重新从数据库里读取数据,并更新到缓存。但是在删除缓存的时候,出现异常,导致A商品的库存还是1000,这样就出现了,数据库和缓存数据不一致的情况。
后台线程
3、在数据库将库存减1、修改成999
2、删除A商品库存缓存,删除成功。
3操作请求
解决方案:先删除缓存,再更新数据库。因为读的时候没有缓存,会去数据库中读,然后更新到数据库。
说明:把读写通过一个相同的标识路由,路由到一个相同的队列中去,然后在内存队列里把更新操作和读操作,进行串行化,然后让一个异步的线程消费队列里的操作,通过这样的操作就可以保证数据库和缓存里的数据在读写并发的情况下是一致的。
6、查询A商品库存为999,并更新至缓存
2、在数据库将库存减1、修改成999
3、在数据库将库存减1、修成999,此时正在修改成999
读写并发时复杂的数据库和缓存双写不一致问题解决方案
0 条评论
下一页