使用这种方案,即使更新数据库失败了也不需要回滚缓存。这种做法虽然巧妙规避了失败回滚的问题,却引出了另外的问题:
如果原来缓存和数据库中的值都是a
线程A尝试将值更新为b,它会先删除缓存,然后更新数据库
当线程A删除完缓存,但还未完成数据库更新时,线程B尝试获取缓存值,发现缓存为空,于是线程B从数据库中取出旧值a,并更新缓存值为a
随后,线程A完成数据库更新操作,数据库中的值变为b。但是,此时缓存中的值却是旧值a,两者不一致。
为了解决一致性问题,可以让线程A给Key加锁,因为写操作特别耗时,这种处理方法会导致大量的读请求卡在锁中。