gpt4 book ai didi

ruby - 如何正确处理原子批处理?

转载 作者:IT王子 更新时间:2023-10-29 06:07:57 25 4
gpt4 key购买 nike

在我的应用程序中,有一个批处理机制。它(理论上)在 redis 列表中累积项目,然后一次处理所有项目并清理(如果需要)。这是代码:

def with_private_key redis, name
return unless redis.exists name

# atomically rename to a random name, so that the batch isn't appended to.
tmpname = "temp:#{SecureRandom.hex}"
redis.rename name, tmpname

# get batch elements
batch = redis.lrange(tmpname, 0, -1).map{|b| JSON.parse(b) }

begin
# actually do something with the batch
yield batch
rescue => ex
# revert and give up
redis.rename tmpname, name
raise
else
# if there was no exception - drop the temp key, it's not needed anymore
redis.del tmpname
end
end

此实现有一个小问题:有时临时 key 不会被删除并保留在数据库中。当我在写这道题的时候,我意识到反向重命名可能会失败,因为已经创建了新的 key ,新的批处理。

那么,我该如何改进这个算法呢?

  • 就地修改批处理不起作用。 LRANGE + LTRIM 对不是原子对。
  • 定期检查临时 key 并尝试重新处理它们(必须更改命名公式以包含 app_id 但这在这里可能并不重要)。
  • 还有什么吗?也许一些 Lua 技巧(还没有使用 Lua)?

编辑:

我发现我关于重命名的理论是无效的。 RENAME command :

Renames key to newkey. It returns an error when the source and destination names are the same, or when key does not exist. If newkey already exists it is overwritten.

最佳答案

我会努力

batch, _ = redis.multi do |r|
r.lrange name, 0, -1
r.ltrim name, 0, -1
end

如果客户端在获取批处理并修整列表后崩溃,则有可能丢失批处理。

关于ruby - 如何正确处理原子批处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039916/

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