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,您可以将其拆分为多个范围,使用游标一次仅在内存中保存几个项目,等等。
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,您可以将其拆分为多个范围,使用游标一次仅在内存中保存几个项目,等等。