4

我有一个包含多个集合的 Redis 数据库,所有集合都由一个通用键模式标识,比如说“myset:”。

有没有办法从命令行客户端按我所有的集合包含的元素数量对它们进行排序并返回该信息?据我所知, SORT 命令只需要单个键。

我知道我可以用一种编程语言很容易地做到这一点,但我更喜欢能够做到这一点,而不必在服务器上安装任何驱动程序、编程环境等。

谢谢你的帮助。

4

2 回答 2

5

不,没有简单的技巧可以做到这一点。

Redis 是一个存储,而不是真正的数据库管理系统。它不支持查询语言。如果您需要检索一些数据,那么您必须预测访问路径并相应地设计数据结构。

例如,在您的示例中,您可以在从您感兴趣的集合中添加/删除项目时维护一个 zset。在这个 zset 中,值将是集合的键,而分数是集合的基数。

按等级检索 zset 的内容将为您提供按基数排序的集合。

如果您没有计划此访问路径并且仍然需要数据,那么您将别无选择,只能使用编程语言。如果您无法安装任何 Redis 驱动程序,那么您可以使用 Redis 转储文件(由 BGSAVE 命令生成),将该文件下载到另一个盒子,然后使用来自 Sripathi Krishnan 的以下包来解析它并计算您的统计信息要求。

https://github.com/sripathikrishnan/redis-rdb-tools

于 2012-09-10T09:19:02.650 回答
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将从 redis 输出中取一个名称$KEYS和一个值,并将它们输出在一行上。

于 2012-09-10T15:31:36.480 回答