假设我正在构建一个纸牌游戏(我使用了一个类比,因为我不能透露最初的项目细节)。考虑以下结构:
Dealer1
91 // Card 9 of spades (Second digit represents card type, check the legend below)
Rejectors:
John
A2 // Ace of hearts
Rejectors:
Rowan
J3
K2
Rejectors:
David
33
Dealer2
43
52
Rejectors:
David
13
Dealer3
44
83
93
// 1: spades ♠, 2: hearts ♥, 3 diamonds 4: clubs ♣.
庄家发一张牌(它被加到他的名单上),一次只有一个玩家有一次机会拔出这张牌,看看它,要么保留它,要么拒绝它(把它放回牌组)。
如果卡被拒绝,我们会标记玩家的名字(这样下次他就不能抽了)。
如果卡片被保留,它将从上面的列表中删除。
如果该卡被任何玩家查看,则不计入任何其他玩家列表(我们可以暂时将其从列表中移除)。
我希望能在任何时候向一个玩家展示他还有多少张牌可以抽。
例如,如果john问庄家1和庄家2还剩多少张牌,答案是7张牌(a2,j3,k2,33,43,52,13),记住91号牌之前被john拒绝了。
现在,如果汉娜问同一个经销商有多少张卡,答案是8(她以前没有拒绝过任何一张卡,因此她的名字不在任何经销商名单中)
规则:
所有经销商的卡都是唯一的(没有两个经销商可以处理同一张卡)
卡是无限的(传统上只有52张卡,但在这个例子中,有随机生成的假想卡)
卡的类型是不相关的,我把它变得更容易(也许不是),认为它是一个随机的身份证。
在redis中保存这些信息的最佳方法是什么?套?哈希?
第一次尝试时,我只保存了一个序列化对象,如下所示(不一定与上面的列表相同):
// Key 1
"Dealer1": [
{
"Card": "A1",
"Rejecters": [
"John"
]
},
{
"Card": "K2",
"Rejecters": [
"David"
]
}
]
// Key 2
"Dealer2": [
{
"Card": "31",
"Rejecters": [
"Adam"
]
},
{
"Card": "Q2",
"Rejecters": [
"David"
]
}
]
密钥是经销商id,值是对象的序列化数组,每个对象表示一张卡及其“拒绝者”(可能不是最佳名称)列表。
我知道这是没有效率的,因为每次我需要查询一个玩家的可用卡的数量时,我必须循环请求的经销商的密钥,获取它的整个列表,计数(客户端)列表中有多少个对象没有玩家的名字。
ps:我使用的是servicestack.redis c#client(但我可以处理原始redis命令/数据类型,并且可以将它们转换为c#代码)。
1条答案
按热度按时间rkue9o1l1#
为每个卡经销商创建一个redis集。
例如,
“经销商\ 1 \套”:[“91,”a1“]
“经销商2\套”:[“a2”,a3”]
“经销商\ 3 \套”:[“b9”,b10,“36”]
约翰每拒绝一张牌,就为他保留一张redis牌。
“卡片\u被\u john \u set拒绝”:[“91”,“a3”,“36”]
现在来计算庄家1和庄家2为john提供的可用卡
使用redis命令
烧结矿经销商1套经销商2套(如果需要,添加更多经销商套件)
你得到一个新的集合,比如说temp\u set[“91”,“a1”,“a2”,“a3”]
然后使用redis命令
sdiff临时集合卡被john集合拒绝
然后得到[“a1”,“a2”],这就是结果。
上面的操作应该很快。但是要使上述操作原子化,需要编写lua脚本。