gpt4 book ai didi

ruby-on-rails - 在 Ruby 和 Redis 中匹配现场玩家的最佳策略?

转载 作者:IT王子 更新时间:2023-10-29 06:11:00 26 4
gpt4 key购买 nike

我正在使用这种相当简单的方法来匹配两个现场玩家:

class Seek
def self.create(uuid)
if opponent = REDIS.spop("seeks")
Game.start(uuid, opponent)
else
REDIS.sadd("seeks", uuid)
end
end

def self.remove(uuid)
REDIS.srem("seeks", uuid)
end
end

然后当我的游戏开始时,我只需执行 Seek.create(uuid)

有时两个人同时寻找,我遇到的小众问题很少。我猜 Redis.spop("seeks") 为两个玩家返回 nil,然后转换然后将它们都添加到 REDIS.sadd("seeks", uuid) 。然后他们都无限期地等待(当然除非另一个玩家出现)。

我的情况似乎相当罕见,但我很好奇我的 seek.rb 文件是否可以用更好的方式编写来防止这种情况发生。

最佳答案

您的问题是 SPOPSADD 之间存在竞争条件。您应该在事务中运行这两个命令。使用 Redis,您可以通过 Lua scripting 实现这一目标,这确保整个脚本在服务器端以原子方式运行。

-- transaction.lua
redis.replicate_commands() -- see https://redis.io/commands/eval#replicating-commands-instead-of-scripts for details

local uuid = ARGV[1] -- pass uuid by script's arguments
local member = redis.call('SPOP', 'seeks')
if (member) then
return member -- get an exist uuid
else
redis.call('SADD', 'seeks', uuid) -- add it to the set
end -- the whole script runs in a transaction

关于ruby-on-rails - 在 Ruby 和 Redis 中匹配现场玩家的最佳策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44338243/

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