如何从Redis存储中返回所有具有匹配关键字的值



在学习一些Redis时遇到了一个问题,我不知道为什么它不起作用。

从我读到的一些帖子和文档中,我了解到我可以用类似于的密钥存储数据

redis.set("fruit:1", "apple")
# OK
redis.set("fruit:2", "banana")
# OK

据我所知,我应该能够得到所有像这样的水果

redis.get("fruit:*")

但我错过了一些东西,因为它一直返回null,我不知道我需要做什么才能返回之类的东西

=> apple, banana

我能够通过扫描(在下面的答案中也有建议(找到如何返回所有匹配的水果键,但我需要的是搜索所有匹配的果实键,然后返回它们的值。

@redis.scan_each(match: "fruit:*") do |fruit|
Rails.logger.debug('even run?')
fruits << fruit
end
=> fruit:1, fruit:2 # What I need though is apple, banana

解决问题的方法(至少到目前为止(是使用mGet-

@redis.scan_each(match: "fruit:*") do |fruit|
Rails.logger.debug('even run?')
fruits << @redis.mGet(fruit)
end

据我所知,你不能这么做(如果可能的话会很酷(。相反,您必须运行扫描SCAN 0 MATCH "fruit:*" COUNT 500,其中500是要在第一次迭代中解析的键数。所以你必须运行多次迭代。。。直到你的钥匙计数结束。

如果你想通过一次迭代获得所有密钥,首先你需要知道数据库中有多少密钥,这样你就可以运行一个命令来查找密钥的总量:dbsize,您可以使用它来代替我的示例中的500值。

redis-cli dbsize

redis-cli INFO Keyspace | grep ^db0 | cut -f 1 -d "," | cut -f 2 -d"="

要返回所有键的所有值,可以使用MGET

https://redis.io/commands/mget

也许您还可以深入了解数据结构

也许上面的解决方案不是正确的,在你的情况下,你也可以用一套来添加你的水果。https://redis.io/commands/sadd

SCAN可能是一项非常昂贵的操作,因为它必须遍历所有键,即使使用模式也是如此。因为Redis是单线程的,当SCAN发生时,其他事情都不会发生,其他请求也会被阻止。如果你只有几把钥匙,这没关系。但是,如果您有很多密钥,这可能会导致严重的性能问题。

您需要的是一个索引,其中包含所有水果的密钥。你可以用一个套装来做这件事,每当你添加水果时,你都会把钥匙添加到套装中:

> SET fruit:1 apple
> SADD fruit:index 1

然后,当你需要所有的水果时,你只需要得到集合的成员:

> SMEMBERS fruit:index
1) "1"
2) "2"

然后得到水果的价值:

> GET fruit:1
> GET fruit:2

相关内容

  • 没有找到相关文章

最新更新