Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Redis哈希中获取顶级结果_Redis - Fatal编程技术网

从Redis哈希中获取顶级结果

从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

我试图在Redis中编写一个查询,以获取哈希键的前2个字段值

基本上,当我执行
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”的用户也会以同样的方式被放入该散列中。特定散列中的每个新输入也会进行检查