首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis命令对密钥进行排序

Redis命令对密钥进行排序
EN

Stack Overflow用户
提问于 2015-04-18 00:46:48
回答 3查看 9K关注 0票数 9

Redis命令键*将返回所有键的列表,scan 0是最近的一种类似的方法,但阻塞较少。是否有任何命令可以按字母顺序、数字顺序、创建时间戳等方式对找到的键进行排序?

标准和高级命令的例子如下:

标准键post:*命令:

代码语言:javascript
复制
post:2150
post:2400
post:1001
post:1006

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

代码语言:javascript
复制
post:1001
post:1006
post:2150
post:2400
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-18 09:53:31

Redis使用键返回键(不要在生产中使用它!)或者扫描无序。没有“想像力”的API来返回排序,但您可以在客户端应用程序中这样做。

票数 10
EN

Stack Overflow用户

发布于 2019-11-21 12:38:04

您可以始终使用您的unix命令,这些命令工作得非常完美。

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

票数 12
EN

Stack Overflow用户

发布于 2022-04-15 14:59:09

为了完整起见:

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

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

代码语言:javascript
复制
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方法”是围绕用例设计一个“复合数据结构”:

代码语言:javascript
复制
// 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

与客户端排序相比,这种排序的优点是性能:它是预先排序的,您可以将其划分为范围,使用游标一次只能在内存中保存几个项,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29711600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档