更新操作缓存并保持不同步

时间:2017-09-06 12:14:59

标签: c# mongodb caching redis persistent-storage

我的人员资料库包含基本操作:添加,获取,更新。

我正在使用Redis cacheMongoDB Persist

有更新人请求的时候: 1.我更新缓存(如果密钥不存在,将添加) 2.我更新了Mongo。

但是发生了什么,如果密钥存在于redis中,但更新redis会失败? (数据将不在syc中)

我很高兴知道这个案例的最佳做法是什么?

由于

1 个答案:

答案 0 :(得分:0)

更新数据时,最佳做法是从redis中删除密钥,然后更新mongodb中的密钥。它比redis和mongo之间的同步数据更新更有效,更安全,更简单。同步更新应该使它们处于事务中并且可能需要具有高成本并且使代码难以编写的分发锁。如果您下次查询相同的密钥,它将从mongo获取数据并将其存储到redis。所以你可以认为这是一个懒惰的缓存更新。

因为在许多缓存方案中,数据查询时间应远远超过数据更新时间,因此延迟更新将具有良好的性能。并且您使用缓存的目的仅仅是加快查询速度,不应该更加注意更新。另外,因为您已经对持久性数据库进行了更新,所以您不需要同时更新易失性缓存。只需将其删除即可。

更新您的评论:

如果我们先删除redis中的密钥然后更新mongdb中的数据,那么就可以避免你说的问题了。

(1)->delete from redis->(2)->update in mongo->(3)

只要您的应用在第(1),(2)或(3)点失败,数据一致性就不会中断。如果app在第(1)点失败,那么数据也不会在mongo中更新。 如果app(2)中的app失败,数据将不会在mongo中更新,因为我们只是从redis中删除了密钥,因此重启时没有数据冲突。 (3)也是。

您可能还想知道操作delete from redis是否失败,如何处理?如果是这样,那么你的redis服务器已关闭,你会遇到比数据同步更大的问题:去启动你的redis服务。

这会是另一个问题,当您恢复redis服务时,是否应该将缓存数据恢复为redis?我的回答是否定的。如果你的redis打开了persist,它会为你恢复它,如果你非常担心数据一致性问题,你应该刷新缓存db。它将显示一个查询键全部错过的过程,我们可以将其称为“冷启动”,但冷启动后,一切都将与旧的相同。