Redis缓存一致问题

场景一:当更新数据时,如更新某商品的库存,当前商品的库存是100,现在更新为99,先更新数据库更改为99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存的是100,这就导致数据库和缓存不一致
解决方案:这种情况应该是先删除缓存,然后在更新数据库,如果删除缓存失败,那就不要更新数据库,如果删除成功,而数据库更新失败,那查询的时候只是从数据库里查了旧的数据而已,这样就能保持数据库与缓存一致性。
场景二:在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没更新完,另一个请求来查询数据,发现缓存里没有,就去数据库查,还是以上面商品库存为例,如果数据库中的库存是100,那么查询的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据更新为99,导致数据库与缓存不一致的情况
解决方案:遇到这种情况,可以用队列去解决这个问题,创建几个队列,比如20个,根据商品ID去做hash值,然后队列个数取模,当有数据更新请求时,先把他丢在队列里去,当更新完成后再从队列里去除,如果在更新的过程中,遇到以上场景,先去缓存里看下有没有数据,如果没有,可以先去队列里看是否有相同商品ID在做更新,如果有,也把查询的请求发送到队列里去,然后同步等待缓存更新完成。(这里有一个优化点,如果发现队列里有一个查询请求了,那么就不要放新的查询进去了,用一个while(true)循环查询缓存,循环200MS左右,如果缓存里还没有则直接取数据库的旧数据,一般情况下是可以取到的。)

你可能感兴趣的:(Redis缓存一致问题)