我使用这个非常简单的手段来匹配两个在场玩家:在Ruby和Redis中匹配现场玩家的最佳策略是什么?
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
文件可以用更好的方式写入,以防止这种情况。
如何使用[Mutex#synchronize](https://ruby-doc.org/core-2.2.0/Mutex.html#method-i-synchronize)? [同步法换并发中旁注](https://stackoverflow.com/questions/14090731/synchronized-method-for-concurrency-in-ruby) –