从Redis哈希中获取顶级结果
我试图在Redis中编写一个查询,以获取哈希键的前2个字段值 基本上,当我执行从Redis哈希中获取顶级结果,redis,Redis,我试图在Redis中编写一个查询,以获取哈希键的前2个字段值 基本上,当我执行HVALS hashname时,我希望得到前两个字段的值(最旧的2个)。这有点像获取SQL数据库中的前2个元组 这在redis中是可能的吗?根据我的实验,HVALS按照您要查找的顺序返回键的值,即首先返回最旧的键。现在,您可以使用客户端程序仅选择前两个值,例如HSET myhmap name“abhi”,HSET myhmap email”test@test“,HSET-myhmap行星“地球”,HSET-myhmap
HVALS hashname
时,我希望得到前两个字段的值(最旧的2个)。这有点像获取SQL数据库中的前2个元组
这在redis中是可能的吗?根据我的实验,
HVALS
按照您要查找的顺序返回键的值,即首先返回最旧的键。现在,您可以使用客户端程序仅选择前两个值,例如HSET myhmap name“abhi”
,HSET myhmap email”test@test“
,HSET-myhmap行星“地球”
,HSET-myhmap星系“仙女座”
<代码>HVALS myhmap将返回“abhi”test@test“
,“earth”
,“andromeda”
根据我的实验,HVALS
按您要查找的顺序返回键的值,即首先返回最旧的键。现在,您可以使用客户端程序仅选择前两个值,例如HSET myhmap name“abhi”
,HSET myhmap email”test@test“
,HSET-myhmap行星“地球”
,HSET-myhmap星系“仙女座”
<代码>HVALS myhmap将返回“abhi”test@test“
,“地球”
,“仙女座”
,不,这是不可能的。Redis散列中字段和值的顺序在所有意图和目的上都是随机的(尽管从小型散列实验中获得了经验证据)。有关元素的排序,请参阅Redis的排序集
更新:为了回答评论中的问题,IIUC看起来你可以用字符串轻松地解决它。由于Redis的特性,在任何给定的时刻,要么有一个用户等待特定的匹配,要么没有用户。如果密钥不存在(即零用户等待匹配),则可以
设置matchmaking:blue username1:token
,如果密钥存在,则可以获取
和删除
它。确保使用SET
的“NX”子命令、MULTI/EXEC
和/或Lua来确保这两个逻辑操作的原子性。不,这是不可能的。Redis散列中字段和值的顺序在所有意图和目的上都是随机的(尽管从小型散列实验中获得了经验证据)。有关元素的排序,请参阅Redis的排序集
更新:为了回答评论中的问题,IIUC看起来你可以用字符串轻松地解决它。由于Redis的特性,在任何给定的时刻,要么有一个用户等待特定的匹配,要么没有用户。如果密钥不存在(即零用户等待匹配),则可以
设置matchmaking:blue username1:token
,如果密钥存在,则可以获取
和删除
它。务必使用SET
的“NX”子命令、MULTI/EXEC
和/或Lua来确保这两个逻辑操作的原子性。尽管进行了实验,但您不能依赖于此。一旦哈希的编码从ziplist(用于较小的值)更改,这将不再适用。作为一种解决方法(这听起来可能有些过分)-您可以将哈希
字段存储在列表中(最初使用RPUSH
)为了获取值,您可以调用特定键上的HMGET
,这些键可以使用LINDEX
0和1(前两个元素)从列表中获取,尽管进行了实验,但您不能依赖于此。一旦哈希的编码从ziplist(用于较小的值)更改,这将不再适用。作为一种解决方法(这听起来可能有些过分)-您可以将哈希
字段存储在列表中(最初使用RPUSH
)为了获取值,您可以调用特定键上的HMGET
,这些键可以使用LINDEX
0和1(前两个元素)从列表中获取,因为它是散列,元素没有顺序,即没有最早的或最上面的。您可能需要尝试列表
或排序集
结构。由于它是散列,因此元素没有顺序,即没有最早的或最上面的。您可能需要尝试列表
或排序集
结构。感谢您的回复。你将如何组织这个问题?我正在构建一个匹配算法,我想匹配在我的应用程序中输入特定字符串的人。例如,如果我输入“blue”,我将执行HSET匹配:blue username1 pushNotificationToken
。然后,另一个输入“blue”的用户也会以同样的方式被放入该散列中。特定散列中的每个新输入还检查其长度是否为2或更多。如果是的话,应该把前两个输入“蓝色”的人匹配在一起,把他们从散列中删除。用建议更新我的答案。谢谢你的建议。不幸的是,不可能假设只有1或0人在等待。此外,我不能使操作原子化,因为这将是一个移动应用程序的API,数百名用户可以同时请求相同的输入。假设10个用户在几乎相同的时间内输入了“蓝色”,但时间上存在疏忽差异。我仍然需要将它们2对2配对。Redis是单线程的,因此即使100个用户同时发送,请求仍将被处理,只有一个。因为您是配对用户,所以要么没有人将传入请求与(零)配对,要么有(一)配对。我仍然认为我是对的,但是请不要介意和不同意。谢谢你的回复。你将如何组织这个问题?我正在构建一个匹配算法,我想匹配在我的应用程序中输入特定字符串的人。例如,如果我输入“blue”,我将执行HSET匹配:blue username1 pushNotificationToken
。然后,另一个输入“blue”的用户也会以同样的方式被放入该散列中。特定散列中的每个新输入也会进行检查