【问题标题】:update operation cache and persist out of sync更新操作缓存并保持不同步
【发布时间】:2018-02-14 22:19:35
【问题描述】:

我有具有基本操作的人员存储库:添加、获取、更新。

我正在使用Redis cacheMongoDB Persist

当有更新人员请求时: 1.我更新缓存(如果key不存在,会添加) 2.我更新了Mongo。

但是如果redis中存在key但是更新redis会失败呢? (数据会超出syc)

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

谢谢

【问题讨论】:

    标签: c# mongodb caching redis persistent-storage


    【解决方案1】:

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

    并且因为在很多缓存场景中,数据查询次数应该远远大于数据更新次数,所以延迟更新会有很好的性能。而且你使用缓存的目的只是为了加快查询,不应该更注意更新。也因为你已经完成了对持久化数据库的更新,所以你不需要同时更新易失性缓存。删掉就好了。

    更新您的评论:

    如果我们先删除redis中的key,再更新mongdb中的数据,就可以避免你说的问题。

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

    每当您的应用程序在第 (1)、(2) 或 (3) 点失败时,数据一致性不会被破坏。如果应用程序在第 (1) 点失败,那么数据也不会在 mongo 中更新。 如果app在第(2)点失败,mongo中的数据不会更新,因为我们只是从redis中删除了key,所以重启时没有数据冲突。 (3) 也是。

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

    这又会是一个问题,当你把redis服务拿回来的时候,是不是要把缓存数据恢复到redis呢?我的回答是否定的。如果你的redis开启了persist,它会为你恢复它,如果你非常关心数据一致性问题,你应该刷新缓存数据库。会浮现出一个查询键全部丢失的过程,我们可以称之为“冷启动”,但是冷启动后,一切都和旧的一样。

    【讨论】:

    • 在你的解决方案中,如果我没有成功从redis中删除密钥,我仍然会在redis和mongo之间不同步数据的情况下。
    • 好问题,当你收到更新请求时,你应该先删除缓存中的key,然后更新mongodb中的数据。在这种情况下,如果您的应用程序在任何地方失败,它将保持它们之间的数据一致。很抱歉没有指出这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多