更新数据时,是先删缓存还是先更新数据库?
其实先删除在更新也有线程安全问题
无论是先删除,还是先更新数据库都会有问题
先删除缓存再更新数据库的方案也存在着线程安全的问题,例如,线程 A 更新缓存,同时,线程 B 读取缓存的数据。可能会出现下面的执行顺序。
(1) 线程 A 删除缓存(2) 线程 B 查询缓存,发现缓存中没有想要的数据(3) 线程 B 查询数据库中的旧数据(4) 线程 B 将查询到的旧数据写入缓存(5) 线程 A 将新数据写入数据库
此时,就出现了数据库中的数据和缓存中的数据不一致的情况。
如果删除缓存失败,也会出现数据库数据和缓存数据不一致的现象。
在实际的生产环境中,推荐 使用先更新数据库再删除缓存
可以采用重试机制
流程如下所示
(1)更新数据库数据;
(2)删除缓存数据失败
(3)将需要删除的 key 发送至消息队列
(4)自己消费消息,获得需要删除的 key
(5)继续重试删除操作,直到成功