gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:54:41 25 4
gpt4 key购买 nike

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

我正在使用 Redis 缓存MongoDB Persist

当有更新人请求时:1.我更新缓存(如果键不存在,它将被添加)2. 我更新了 Mongo。

但是如果key存在于redis中但是更新redis会失败呢? (数据将不同步)

我很高兴知道这种情况下的最佳做法是什么?

谢谢

最佳答案

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

而且因为在很多缓存场景下,数据的查询次数应该远远多于数据的更新次数,所以惰性更新会有很好的性能。而你使用缓存的目的只是为了加快查询速度,不应该更多地关注更新。也因为你已经完成了对持久数据库的更新,所以你不需要同时更新 volatile 缓存。只需删除它即可。

您的评论更新:

如果我们先删除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,它会为你恢复,如果你非常关心数据一致性问题,你应该flush cache db。它会浮出一个过程,查询键会全部丢失,我们可以称之为“冷启动”,但冷启动后,一切都会像以前一样。

关于c# - 更新操作缓存并保持不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com