Redis获取列表的所有值而无需迭代且不弹出


73

我有简单的redis列表键=>“ supplier_id”

现在,我想要它检索列表的所有值,而无需实际遍历列表或从列表中弹出值

从列表中检索所有值的示例现在,我遍历了redis的长度

element = []
0.upto(redis.llen("supplier_id")-1) do |index| 
  element << redis.lindex("supplier_id",index)
 end

没有更好的Redis建模迭代就可以做到这一点吗?谁能建议


您能描述一下Redis列表要做什么吗?也许您应该使用其他密钥类型。
eyossi 2012年

@eyossi的想法是创建一个带有选项值的选择标签,该标签是由provider_id表示的数据库,因为在关系数据库中检索记录非常昂贵,因为我们想到在创建时将所有vendor_id都转储到redis中,并在销毁它们时将其删除。数据库
Viren 2012年

Lists上有官方的Redis文档,对此有更详细的说明。更多信息请参见redis.io/topics/data-types-intro#redis-lists
raksheetbhat

Answers:


172

要使用Redis检索列表中的所有项目,您无需迭代和获取每个单独的项目。这确实是低效的。

您只需要使用LRANGE命令一次即可检索所有项目。

elements = redis.lrange( "supplier_id", 0, -1 )

将返回列表中的所有项目,而不会更改列表本身。


3
如果通过提高内存效率来表示增量迭代项目,则可以使用llen并在lrange调用上循环来实现它,但是这样做会增加往返次数,并且会失去一致性。
Didier Spezia

每当我尝试此操作时,我都会收到错误“无效参数”
里卡多

@DidierSpezia这以我添加到redis中的相反顺序返回。有没有办法按插入顺序获取输出?
user1692342

2
如果使用RPUSH而不是LPUSH插入,则插入顺序相同。
Didier Spezia 2015年

2

我对您的问题尚不清楚,但如果provider_id是数字,为什么不使用ZSET

像这样添加您的值:

ZADD suppliers 1 "data for supplier 1"  
ZADD suppliers 2 "data for supplier 2"  
ZADD suppliers 3 "data for supplier 3"  

然后,您可以删除所有内容(但不包括供应商三),如下所示:

ZREMRANGEBYSCORE suppliers -inf 2

要么

ZREMRANGEBYSCORE suppliers -inf (3

如果您只想阅读它,它也使您可以非常快速地访问(按供应商ID)。

希望有帮助!


您可以为确定它肯定能帮助我们提供的文档
Viren
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.