更新缓存策略:
对于低一致性需求的业务:使用redis自带的内存淘汰机制就行了,自动失效,等查询时再更新。
对于高一致性需求的业务:推荐主动更新,由缓存的调用者更新数据库的同时更新缓存(删除缓存)。
这里的一致性指的是缓存中的数据和数据库中的数据一致。
1.更新缓存还是删除缓存?
推荐删除缓存,因为如果数据库一直更新,缓存也随之更新,但是这期间根本没人来查数据,那这些更新都是无用的。直接删除缓存,等用户查询时,查询数据库的同时更新缓存更好。
2.如何保证缓存与数据库操作的同时成功或失败?
3.先删缓存再更新数据库还是先更新数据库再删缓存?
答:先更新数据库在删除缓存
先更新数据库,再删缓存的情况:
假设一开始缓存中没有数据,数据库中数据是10
线程1,查询数据库中的数据10,同时更新为缓存10。
线程2,更新数据库数据为20,同时删除缓存。
线程1查询到数据库中的数据10后,还没更新缓存,就切换到线程2,线程2更新数据库数据为20,同时删除缓存,这时切回线程1,更新缓存为10。这时数据库中数据为20,缓存数据为10出现了不一致的情况。
但这种发生几率很小,更新缓存是很快的操作,这时被切到线程2更新数据库数据几乎不太可能。
而且发生了这种事情我们也可以给缓存设置时间,从而弥补这种事情发生。
先删缓存,再更新数据库的情况:
这种方法不但会在上面哪种情景下发生数据不一致,在下面这种情景下也会发生数据不一致。
假设一开始缓存中的数据是10,数据库中数据是10
线程1,删除缓存,更新数据库数据为20
线程2,查询数据,同时更新缓存
线程1删除缓存后,这时切换到线程2,线程2去查询缓存,没有查到就去数据库中进行查询,
最终把数据库旧值10查询出来,同时把缓存更新为10,这时切回线程1,把数据库数据更新为20
最终数据库数据为20,缓存数据为10,数据不一致。