在学习一些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