redis学习(六) 排序(sort,by,store,性能优化)

Redis的SORT命令能对列表、集合和有序集合进行排序,支持DESC、ALPHA、LIMIT等选项。通过BY参数,可以指定参考键进行排序,GET参数则用于返回自定义键值。在性能优化上,应注意减少元素数量n,限制返回结果m,并利用STORE参数缓存结果。排序事件复杂度为O(n+mlog(m))。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SORT命令

sort命令可以对列表类型、集合类型和有序集合类型键进行排序,并且可以完成与关系型数据库中连接查询相类似的任务。

sort key [DESC][ALPHA]  [limit offset  count ]

1. 如果没有加上ALPHA参数的话,sort命令会尝试将所有元素转为双精度浮点数来比较,如果无法转换则会提示错误。

2. DESC 命令sort默认按照从小到大的顺序排列,加上desc按照从大到小的顺序排列

3. limit offset count 获取从索引offset开始的count个元素

BY参数语法

by命令搭配sort命令使用,语法是 BY  参考键

其中参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名->字段名)。如果提供了BY参数,sort

命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*并获取其值,然后根据该值对元素进行排序。

1>by后面是散列类型

SORT mykey BY post:*->time desc;

取键mykey的值替换* ,就是post:值,获取键post:值的值进行倒序排列。

2>by后面是字符串类型

SORT mykey by post:* desc;

note:1.  如果by后面的参考键名没有包含*,sort命令将不会执行排序操作

        2.  如果几个元素的参考键值相同,则sort命令会在比较元素本身的值来决定元素的顺序。

        3.  当某个元素的参考键不存在时,会默认参考键的值为0

        4.  参考键虽然支持散列类型,但是*只能出现在->符号的前面,出现在后面redis不会认为是常量键名,结果还是按照元素大小进行排序,这个比较特殊

GET 参数

SORT命令的get参数,不影响排序,作用是使sort命令的返回结果不再是元素自身的值,而是get参数指定的键值,get参数的规则和by参数的规则一样,get参数也支持字符串类型和散列类型的键,并使用*作为占位符。要实现在排序后直接返回Id对应的文章标题。

实现按照时间排序后直接返回Id对应的文章标题

sort tag:ruby:posts by posts:->time desc get posts:*->title

1> 一个sort命令中可以有多个get参数(而by参数只能有一个)

sort tag:ruby:posts by post:* -> time desc get post:*->title get post:*->time 

2> 如果有n个get参数,每个元素返回的结果就有N行,get  #返回的是元素本身,就是上面例子中

键 tag:ruby:posts  的 元素

sort tag:ruby:posts by post:*->time desc get post:*->title get # 

STORE参数

默认情况下sort会直接返回排序结果,如果希望将排序后的结果保存,可以使用store参数,如将结果保存到sort.result键中

,直接在sort命令的后面加上sort 键 名,并且有键的类型会是列表类型,如果键已经存在则会覆盖它,加上store参数后,sort命令的返回值为结果的个数

sort tag:ruby:posts by post:*->time desc get post:*->title store sort.result

性能优化

sort命令的事件复杂度是O(n+mlog(m)),其中n表示要排序的列表(集合或者有序集合中元素的个数),m表示要返回的元素个数。

当n较大时候sort命令的性能相对较低,并且redis在排序前会建立一个长度为n的容器来存储待排序的元素。

sort命令使用注意:

1> 尽可能减少待排序键中元素的数据量 (使n尽可能小)

2>使用limit参数获取需要的数据 (使m尽可能小)

3>如果要排序的数据量大,可以使用store参数缓存结果,便于再次使用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值