按照元素数量在Redis中对集合进行排序

4
我有一个Redis数据库,其中包含多个集合,所有集合都由共同的键模式标识,比如说"myset:"。
在命令行客户端中,是否有一种方式可以按照它们所包含的元素数量对所有集合进行排序并返回这些信息?就我所了解的,SORT命令只接受单个键。
我知道可以用编程语言很容易做到这一点,但我更喜欢能够在不必在服务器上安装任何驱动程序、编程环境等的情况下完成这项工作。
谢谢你的帮助。
2个回答

5
不,没有简单的技巧可以做到这一点。
Redis是一个存储系统,不是真正的数据库管理系统。它不支持查询语言。如果您需要检索某些数据,则必须预先考虑访问路径并相应地设计数据结构。
例如,在您的示例中,您可以在添加/删除感兴趣的集合时维护zset。在这个zset中,值将是集合的键,分数将是集合的基数。
按秩检索zset的内容将按基数排序给出集合。
如果您没有计划进行此访问路径但仍需要数据,则除了使用编程语言外别无选择。如果您无法安装任何Redis驱动程序,则可以从Redis转储文件(由BGSAVE命令生成)中工作,将此文件下载到另一个框中,并使用Sripathi Krishnan的以下软件包解析它并计算所需的统计信息。 https://github.com/sripathikrishnan/redis-rdb-tools

2
如果这只是个“一次性”的需求,并且记住 keys 命令并不适用于生产环境,那么可以使用类似下面的命令:redis-cli keys 'myset:*' | awk '{printf "scard %s\n", $1}' | redis-cli。但如果这是数据模型中重要的方面,保持一个 zset 似乎是个不错的主意。 - Linus Thiel
谢谢,我不知道那个Python包,看起来很适合我打算做的其他事情。 @linus-g-thiel:太好了,正是我需要的。这只是为了调试目的而进行的一次性操作。这回答了我的问题,不确定如何点赞评论。 - fpighi

3

注意:本答案中的方法并不是通用解决方案--请记住,在生产环境中不建议使用keys命令。

话虽如此,这里提供了一种解决方案,它将按基数排序后输出集合名称及其长度(基数)。

# Capture the names of the keys (sets)
KEYS=$(redis-cli keys 'myset:*')

# Paste each line from the key names with the output of `redis-cli scard key`
# and sort on the second key - the size - in reverse

paste <(echo "$KEYS") <(echo "$KEYS" | sed 's/^/scard /' | redis-cli) | sort -k2 -r -n

请注意上面使用了paste命令。我指望redis-cli按顺序向我发送结果,我相信它一定会这样做。因此,paste将从$KEYS中获取一个名称,从redis输出中获取一个值,并将它们输出在同一行上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接