gpt4 book ai didi

ruby - 在 after_commit 钩子(Hook)中缓存数据时确保一致性

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:25 25 4
gpt4 key购买 nike

对于特定的数据库表,我们需要一个始终与数据库同步的内存缓存。我目前的尝试是在 after_commit Hook 中将更改写入缓存 - 这样我们确保不会将任何更改写入缓存,以后可能会恢复。

但是,这种策略容易受到以下情况的影响:

  1. 线程 A 锁定并更新记录,存储值 1
  2. 线程 A 提交更改
  3. 线程 B 锁定并更新记录,存储值 2
  4. 线程 B 提交更改
  5. 线程 B 运行 after_commit Hook ,因此缓存现在的值为 2
  6. 线程 A 运行 after_commit Hook ,因此缓存现在具有值 1 但应该具有值 2

我对这个问题的看法是否正确以及如何解决这个问题?

最佳答案

你对这个问题的看法是对的。

有一个 after_save 回调在同一事务中运行。您可能希望使用那个而不是在交易后运行的 after_commit Hook 。

但是您需要自己处理回滚事务。

或者您可能希望以不依赖于特定实例的方式编写缓存方法。而是通过首先从数据库中重新加载记录来缓存在数据库中找到的最新版本。

但即使如此:多线程系统也很难保持同步。而且您甚至无法确保发送到缓存的第一个或第二个更新是否会被存储,因为缓存系统也可能是多线程的。

您可能想阅读有关 different consistency models 的内容.

关于ruby - 在 after_commit 钩子(Hook)中缓存数据时确保一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39363650/

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