Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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

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
Lua 从hashamp访问值而不在redis中指定键_Lua_Redis - Fatal编程技术网

Lua 从hashamp访问值而不在redis中指定键

Lua 从hashamp访问值而不在redis中指定键,lua,redis,Lua,Redis,我希望在不提供密钥的情况下,从redis中的哈希中访问具有给定模式的值 范例 HSET myKey va11 "Hello" val2 "Hi" Val3 "GooMorning" val4 "Good Evening" HSET myKey2 va11 "one val2 "two" Val3 "three" val4 "four" 我有一组键,它们的值如上所述。是否有任何方法可以在不提供键的情况下检索值 我只想检查Good*是否有任何值,类似于没有提供键的值。Redis没有提供现成的功

我希望在不提供密钥的情况下,从redis中的哈希中访问具有给定模式的值

范例

HSET myKey  va11 "Hello" val2 "Hi" Val3 "GooMorning" val4 "Good Evening"
HSET myKey2  va11 "one val2 "two" Val3 "three" val4 "four"
我有一组键,它们的值如上所述。是否有任何方法可以在不提供键的情况下检索值


我只想检查Good*是否有任何值,类似于没有提供键的值。

Redis没有提供现成的功能。但是,如果我正确理解你的问题,你可以很容易地添加它

使用哈希中的所有值保留一个排序集,例如调用它
allvals
(即,在每次哈希更新时对其进行排序)。将其用于后缀搜索,作为存在性检查的手段:

ZRANGEBYLEX allvals "[Good" "[Good\xff"
编辑:根据您的说明,这种方法不是您想要的。以下是我对修改后的挑战的看法

所以。您要寻找的是一种获取哈希键名称的方法,如果它们的某个字段中包含特定值。一种方法是扫描所有散列并查找该值(正如@tobiash所建议的),但是,根据数据集的大小,这可能会非常昂贵。另一种方法是使用集合作为索引散列的方法。基本前提是获取散列中的每个值并为其创建集。每个这样的集合的成员都是包含该值的散列的实际键名

让我们看看您的示例的
myKey
应该如何索引(是的,我们正在这里构建索引)。首先,您将创建以下集合:

SADD idx:Hello myKey
SADD idx:Hi myKey
SADD idx:GooMorning myKey
SADD "idx:Good Evening" myKey
现在,通过在
idx:Hello
上执行,您将获得所有具有
Hello
值的键名。然而,因为您要查找的是后缀搜索,所以对于每个值,您实际上需要维护多个集合,其中每个集合为值的子字符串编制索引。例如,对于字符串
Hello
,您实际上需要:

SADD idx:H myKey
SADD idx:He myKey
SADD idx:Hel myKey
SADD idx:Hell myKey
SADD idx:Hello myKey
如果您要创建一个脚本来调用它来更新哈希值,那么Lua可以在这里提供帮助。应该为脚本指定哈希键名和字段名+值。一旦调用,脚本不仅需要创建/更新实际的散列,还需要迭代所有字段值并为它们(及其各自的子字符串)构造索引


如果您在编写脚本时需要帮助,请告知我们;)

>我看到你在使用“Lua”标签——如果Lua不是必须的,请考虑下面的例子。我将提供一些代码:

import redis

# connect to local redis-server:6379
r = redis.Redis()
# initialize sample "myKey" hash
r.hmset("myKey", {'val1': "Hello", 'val2': "Hi", 'val3': "GoodMorning", 'val4': "Good Evening"})
# provide "starts with" pattern (this could obviously be a regex as well)
pattern = "Good"
# find all values starting with the pattern and return them
values_matching = filter(lambda x: x.startswith(pattern), r.hvals("myKey"))
# print values: ["GoodMorning", "Good Evening"]
print values_matching
您并不是说需要匹配值的键。如果您这样做了,那么您应该查看该命令

阅读评论后编辑:是的,您需要使用循环遍历散列中的所有键/值。经修正的示例如下:

import redis

r = redis.Redis()
r.hmset("myKey", {'val1': "Hello", 'val2': "Hi", 'val3': "GoodMorning", 'val4': "Good Evening"})
pattern = "Good"
# use hgetall() to iterate over all key-value pairs and form values_matching by looking only at pairs where the value starts with "Good"
values_matching = dict([(k, v) for k, v in r.hgetall("myKey").iteritems() if v.startswith(pattern)])
# print values: {'val3': 'GoodMorning', 'val4': 'Good Evening'}
print values_matching

如果我的理解是正确的。我需要使用HGETALL命令迭代redis中的所有键,对吗?对不起,我认为我没有明确指定我的要求。我的要求是我需要检索完整的哈希详细信息。例如,当我发现某个值arg为Good*。然后我需要得到完整的像(va11“你好”val2“你好”Val3“早上好”val4“晚上好”)