Redis命令键*将返回所有键的列表,scan 0是最近的一种类似的方法,但阻塞较少。是否有任何命令可以按字母顺序、数字顺序、创建时间戳等方式对找到的键进行排序?
标准和高级命令的例子如下:
标准键post:*命令:
post:2150
post:2400
post:1001
post:1006花式命令按字母顺序对键进行排序:
post:1001
post:1006
post:2150
post:2400发布于 2015-04-18 09:53:31
Redis使用键返回键(不要在生产中使用它!)或者扫描无序。没有“想像力”的API来返回排序,但您可以在客户端应用程序中这样做。
发布于 2019-11-21 12:38:04
您可以始终使用您的unix命令,这些命令工作得非常完美。
redis-cli --scan --pattern yourpattern* | sort
发布于 2022-04-15 14:59:09
为了完整起见:
从技术上讲,您可以使用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项
与客户端排序相比,这种排序的优点是性能:它是预先排序的,您可以将其划分为范围,使用游标一次只能在内存中保存几个项,等等。
https://stackoverflow.com/questions/29711600
复制相似问题