当前位置: 首页 > 知识库问答 >
问题:

Redis中是否有类似MGET的HASH数据结构命令?

云弘壮
2023-03-14

我需要在一个调用中获得一组已知的REDIS哈希密钥的所有数据字段。我使用MGET的字符串键,如:

MGET键[键…]

从1.0开始提供。0

时间复杂度:O(N),其中N是要检索的密钥数。

返回所有指定键的值。对于不包含字符串值或不存在的每个键,将返回特殊值nil。因此,操作从未失败。

HMGET只为一个键带来所有字段。我需要许多键所有字段按键。

共有2个答案

拓拔泓
2023-03-14

正如在另一个答案中所指出的,没有内置方式,但除了事务之外还有更多的变通方法。

local r = {}
while (#KEYS > 0) do
  local k = table.remove(KEYS,1)
  r[#r+1] = redis.call('HGET', k, ARGV[1])
end

return r

答案超出范围:)

濮俊美
2023-03-14

没有这样的命令,redis散列在散列中工作,因此HMGET在一个散列中工作,并给出该散列中的所有字段。无法一次访问多个哈希中的所有字段。

但是,您可以在每个哈希上使用多个HMGET并获取所有字段。您可以通过管道将这些命令一次性执行。

选项1,例如伪代码中的实现

Pipeline p
List<String> = p.hgetall('key1', fields...); 
List<String> = p.hgetall('key2', fields...);
List<String> = p.hgetall('key3', fields...);
p.exec(); 

选项2另一个选项是编写LUA脚本并使用EVAL调用

local array = {}
local keys = redis.call('KEYS', '<your pattern>')

for _,key in ipairs(keys) do
    local val = redis.call('HGETALL', key)
    array[#array + 1] = val
end

return array

打电话给lua sctipt

redis-cli EVAL "$(cat test.lua)" 0

1) 1) "field1"
   2) "val"
2) 1) "field1"
   2) "val"
   3) "field2"
   4) "val2"
 类似资料:
  • 我有一个支持以下操作的数据结构: 可以在固定时间内插入项目。对于该项,数据结构分配一个唯一的正整数。(说明:指定的整数不是插入项的函数,用户对指定的整数没有选择权。它完全由数据结构选择。) 它是使用指针数组实现的,其中指定的整数是存储项的索引。未使用的索引以链表方式链接起来,以便进行固定时间的插入。 这种数据结构的名称是/应该是什么?

  • 问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如

  • 哈希表(Hash Table,也叫散列表),是根据关键码值 (Key-Value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表的实现主要需要解决两个问题,哈希函数和冲突解决。 哈希函数 哈希函数也叫散列函数,它对不同的输出值得到一个固定长度的消息摘要。理想的哈希函数对于不同的输入应该产生不同的结构,同时散列结果应当具有同一性(输出值尽

  • 问题内容: Redis如何处理(来自不同客户端的)多个线程来更新Redis中的相同数据结构?对于这种用例,建议的最佳实践是什么? 问题答案: 如果您在某个时候读了《小红衣人》一书,这句话就来了。 “您可能不知道,但是 Redis实际上是单线程的 ,这确保了每个命令都是原子的。 在执行一个命令时,不会再运行其他命令 。” 看看http://openmymind.net/2012/1/23/The-L

  • 问题内容: 我正在考虑将Java用于大型项目,但是我找不到能够在Java中远程表示结构的任何东西。我需要能够将网络数据包转换为可在应用程序中使用的结构/类。 我知道这是可以使用,但这种方式是 不 接受的。因此,我很好奇是否可以像在C语言中那样将一组字节“广播”到一个结构中。如果这不可能,那么我将无法使用Java。 因此,我要问的问题是,是否有可能无需指定对齐方式和数据类型就将任何类型的对齐数据都转

  • 问题内容: 我需要用同一行的一组列(从左到右)中的第一个非空条目填充一个单元格-类似于SQL中的coalesce()。 在以下示例表中 我想在A行的每个单元格中放置一个单元格函数,这样我将得到: 我知道我可以使用一系列IF函数来做到这一点,但是在我的实际工作表中,我有30列可供选择,因此,如果有一种更简单的方法,我将很高兴。 问题答案: 这是一个数组公式。输入公式后,按+ +使Excel将其评估为