Redis 命令对键进行排序

Redis Command To Sort Keys

Redis 命令 keys * 将 return 所有键的列表, scan 0 是更新的方法做类似的事情,但阻塞更少。是否存在任何命令可以对找到的键进行排序,例如按字母顺序、数字顺序、创建时间戳等?

寻找的标准命令和奇特命令示例:

标准键post:*命令:

post:2150
post:2400
post:1001
post:1006

花哨的命令 按字母顺序对键进行排序:

post:1001
post:1006
post:2150
post:2400

Redis returns 键,使用 KEYS(不要在生产中使用它!)或 SCAN,无序。没有 "fancy" API 到 return 排序,但您可以在客户端应用程序中进行排序。

您始终可以使用完美运行的 unix 命令

redis-cli --scan --pattern yourpattern* | sort

为了完整起见:

从技术上讲,您可以使用 EVAL 命令在 Redis 的上下文中执行此操作。

这将根据 post:* 模式获取所有键,然后对键进行排序,并将它们用于 MGET 所有项目。

EVAL "local keys = redis.call('KEYS','post:*');
      if (table.getn(keys) == 0) then return {} end;
      table.sort(keys);
      return redis.call('MGET',unpack(keys));"

这种方法可以提高性能,但使用 LUA 脚本操作 Redis 可能会让人感觉不够优雅。

KEYS 命令也有问题,当然还有 EVAL 的一些安全考虑。

我想说解决这个问题的“正确的 Redis 方式”是围绕用例设计一个“复合数据结构”:

// a scoreless sorted set can be used as an index
SET post:1500 <value>
ZADD posts_index 0 post:1500

// Whenever you need a sorted (range) of items, you first check the index 
ZRANGE posts_index - + BYLEX 
ZRANGE posts_index [posts:1000 (posts:2000 BYLEX 

排序集posts_index只是post“命名空间”中所有键的集合。当然,如果您设置 TTL 或从缓存中删除项目,您也需要为 posts_index 集管理它。

ZRANGE的结果进行排序,可用于GET/MGET

与 client-side 排序相比,此排序的优势在于性能:它是 pre-sorted,您可以将其拆分为多个范围,使用游标一次仅在内存中保存几个项目,等等。