【问题标题】:Atomic updates to IronCacheIronCache 的原子更新
【发布时间】:2012-11-29 16:35:44
【问题描述】:

我看到您可以在 IronCache 中以原子方式递增一个值,但是如果您有许多 IronWorker 试图将一个值 put 一个值添加到单个缓存键中怎么办?将这些值更新放在消息队列中以便将更新同步到缓存会更好还是有其他惯用的方法?

【问题讨论】:

  • 嗨@devth,你要放入缓存的是什么?你需要有正确的工人顺序吗?
  • 嗨@Travis,我将状态汇总存储在单个缓存键中。不同的worker可以更新不同部分的状态(值是分层的json)。只要它们不同时读取/更新,就可以了,但是为了避免没有手动同步的竞争条件,我需要比较和交换。

标签: memcached mq iron.io iron


【解决方案1】:

目前没有惯用的方法来更新非整数缓存项而不引起竞争条件之神。有很多不同的技巧可以解决这个限制,但是您的 MQ 解决方案(假设只有一个工作人员正在编写更改)可能是您最好的选择。

我们意识到了这个缺陷,并且正在努力修复,但我们目前没有什么要宣布的。

【讨论】:

  • 感谢@Paddy - 有道理。
  • 如何确保单身工人?我正在考虑使用 webhook 来启动工作人员以使用队列中的更新,但这可能会触发同一工作人员的多个实例。
  • @devth 您可以在上传代码时使用 max_concurrency 属性来限制可以并行运行的工作人员数量。要创建一个单例工作者,只需将其设置为 1。:)
  • @PaddyForan 为什么不能使用原子增量作为比较和设置互斥锁的基础?
【解决方案2】:

执行此操作的一种方法是将您的值拆分为多个缓存条目。假设你有你的 json 层次结构:

{
    "x": "y",
    "sub1": {
        "a": "b"
    },
    "sub2": {
        "c": "d"
    }
}

改成:

{
    "x": "y",
    "sub1": "cache_key_a",
    "sub2": "cache_key_b"
}

然后在cache_key_a中:

{
    "a": "b"
}

对 cache_key_b 等做同样的事情。这能解决你的问题吗?

【讨论】:

  • 我将其保留为单个键的原因是因为我的前端请求每个页面上的缓存。它是一个状态缓存,由后台工作人员定期更新,FE 需要始终显示最新状态。如果我将它分成单独的 k/v 对,每次页面加载时它会变成大约 15 个缓存请求。
猜你喜欢
  • 2014-04-07
  • 2017-03-13
  • 2016-03-31
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多