
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了缓存功能的应用等基础知识,而今天我们就再来了解一下,缓存与数据库更新之间的关系。
一、先更新数据库再更新缓存
这种方案会有线程安全的问题。
例如,同时有线程A和线程B对数据进行更新操作,可能会出现下面的执行顺序。
(1)线程A更新了数据库
(2)线程B更新了数据库
(3)线程B更新了缓存
(4)线程A更新了缓存
此时就会出现数据库中的数据与缓存的数据不一致的情况,这是因为线程A先更新了数据库,可能因为网络等异常情况,线程B更新完数据库进而更新了缓存,当线程B更新完缓存后,线程A才更新缓存,这就导致了数据库数据与缓存数据的不一致。
这种方案也有其不适用的业务场景。
一个业务场景就是数据库写多读少的场景,这种场景下采用先更新数据库再更新缓存的策略,就会导致缓存并未被读取就会被频繁的更新,极大的浪费了服务器的性能。
再一个业务场景就是数据库中的数据不是直接写入缓存的,而是需要大量的复杂运算,将运算结果写入缓存。如果这种场景下使用先更新数据库再更新缓存的策略,也会造成服务器资源的浪费。
二、先删除缓存再更新数据库
先删除缓存再更新数据库的方案也存在着线程安全的问题,例如,线程A更新缓存,同时,线程B读取缓存的数据。可能会出现下面的执行顺序。
(1)线程A删除缓存
(2)线程B查询缓存,发现缓存中没有想要的数据
(3)线程B查询数据库中的旧数据
(4)线程B将查询到的旧数据写入缓存
(5)线程A将新数据写入数据库
此时,就出现了数据库中的数据和缓存中的数据不一致的情况。如果删除缓存失败,也会出现数据库数据和缓存数据不一致的现象。
三、先更新数据库再删除缓存
这种方式也有极小的概率发生数据库数据和缓存数据不一致的情况,例如,线程A做查询操作,线程B执行更新操作,其执行的顺序如下所示。
(1)缓存刚好失效
(2)请求A查询数据库,获取到数据库中的旧值
(3)请求B将新值写入数据库
(4)请求B删除缓存
(5)请求A将查到的旧值写入缓存
如果上述顺序一旦发生,就会造成数据库中的数据和缓存中的数据不一致的情况发生。
但是,先更新数据库再删除缓存的策略发生数据库和缓存数据不一致的概率很低,原因就是:(3)的写数据库操作比步骤(2)的读数据库操作耗时更短,才有可能使得步骤(4)先于步骤(5)执行。但是,往往数据库的读操作的速度远快于写操作,因此步骤(3)耗时比步骤(2)更短,这一场景很难出现。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。