缓存小技巧--异步更新缓存时remove cache数据

在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存的应用已经越来越多了(为什么是异步更新缓存,因为异步不仅可以提高系统性能,而且提高系统的伸缩性和可用性),由于缓存的更新是异步的,可能由于多个更新缓存的并发线程而导致的脏数据。

 

举例,有下面2个线程A、B同时执行业务,执行完业务之后,会产生2个异步的线程A1、B1去更新缓存,在理想情况下,A1和B1应该保持顺序性,即A1先更新缓存、B1再更新缓存,但是由于线程本身是异步的,加上2个线程可能分布在不同应用服务器上,所以对执行线程时顺序没有办法保证,如果B1先执行,A1再执行,这样B1的数据就被A1覆盖掉,从而导致脏数据。有没有什么好的办法防止这种脏数据呢?


解决办法:线程每次异步执行更新缓存时,不去更新缓存,而是去remove缓存。
这样的好处,不管A1、B1的执行顺序如何,都不可能导致缓存数据被覆盖的现象,因为每次是去remove缓存;
等待下次查询时将数据库中的数据load进缓存中。
缺点:如果更新的频率比较高,则可能会增加数据库的负载,所以事先必须先评估好业务。

 

你可能感兴趣的:(应用服务器,cache,互联网)