Redis自学笔记:4.3进阶-排序
4.3排序
4.3.1有序集合的集合操作
有序集合没有zinter和zunion命令,使用其他命令实现方法:
multi
zinterstore tempKey ...
zrange tempKey ...
del tempKey
exec
4.3.2 sort命令
sort key [alpha] [asc|desc] [limit offset count]
sort命令可以对列表类型、集合类型和有序集合类型进行排序,并且完成与
关系数据库中连接查询相类似的任务
127.0.0.1:6379> lpush bar 1 23 6 98 999 55 6.3
7
127.0.0.1:6379> sort bar
1
6
6.3
23
55
98
999
在对有序集合类型排序会忽略元素的分组,只针对元素自身的值进行排序
127.0.0.1:6379> zadd baz 100 9 800 2 500 5 700 3 400 6
5
127.0.0.1:6379> sort baz
2
3
5
6
9
127.0.0.1:6379> zrange baz 0 -1
9
6
5
3
2
sort命令还可以通过alpha参数实现按照字典顺序排列非数字元素
127.0.0.1:6379> lpush quux book good look food wood tool
6
127.0.0.1:6379> sort quux alpha
book
food
good
look
tool
wood
sort命令的desc参数可以实现将元素按照从大到小排列(默认asc升序)
127.0.0.1:6379> sort quux alpha desc
wood
tool
look
good
food
book
sort命令limit offset count参数,表示跳过前offset个元素并获取之后
的count个元素.
127.0.0.1:6379> sort quux alpha asc limit 1 3
food
good
look
4.3.3 by参数
sort key ... by 参考键 [asc|desc]
参考键可以是字符串类型或则散列类型键的某个字段(键名->)
如果提供了by参数,sort命令将不再依据元素自身的值进行排序,
而是对每个元素使用元素的值替换参考键中第一个"*"并获取其值,
然后依据该值对元素排序.
字符串类型:
127.0.0.1:6379> lrange book 0 -1
Python
Tangshi
Sanguo
127.0.0.1:6379> get book:Python
price:36
127.0.0.1:6379> get book:Sanguo
price:48
127.0.0.1:6379> get book:Tangshi
price:28
127.0.0.1:6379> sort book by book:* alpha
Tangshi
Python
Sanguo
散列类型:
127.0.0.1:6379> hset bok:Python price 36
1
127.0.0.1:6379> hset bok:Tangshi price 28
1
127.0.0.1:6379> hset bok:Sanguo price 48
1
127.0.0.1:6379> sort book by bok:*->price
Tangshi
Python
Sanguo
- 参考键的用来比较的值相同时,sort命令会再比较元素的大小来绝对二者顺序
- 参考键虽然支持散列类型,但是 * 只能在 -> 前面.否则返回值是元素本身大小排序.
4.3.4 get参数
get参数不影响排序,它的作用是sort命令返回结果是get参数指定的键值.
get参数的规则和by参数一样,get参数也支持字符串和散列类型,并使用 * 作为占位符.
127.0.0.1:6379> hset bok:Sanguo name SanGuoYanYi
1
127.0.0.1:6379> hset bok:Tangshi name Tangshi300
1
127.0.0.1:6379> hset bok:Python name PythonStart
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name
Tangshi300
PythonStart
SanGuoYanYi
在一个sort命令可以有多个get参数(by参数只能一个).
127.0.0.1:6379> hset bok:Python ZX 人民邮电出版社
1
127.0.0.1:6379> hset bok:Tangshi ZX 商务印书馆
1
127.0.0.1:6379> hset bok:Sanguo ZX 人民文学出版社
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX
Tangshi300
商务印书馆
PythonStart
人民邮电出版社
SanGuoYanYi
人民文学出版社
- get # 会返回元素本身的值
127.0.0.1:6379> sort book by bok:*->price get # get bok:*->name get bok:*->ZX
Tangshi
Tangshi300
商务印书馆
Python
PythonStart
人民邮电出版社
Sanguo
SanGuoYanYi
人民文学出版社
4.3.5 store参数
默认情况下sort会直接返回排序结果,使用store参数会保存结果.
例如把结果存入book.view键
127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX store book.view
6
127.0.0.1:6379> lrange book.view 0 -1
Tangshi300
商务印书馆
PythonStart
人民邮电出版社
SanGuoYanYi
人民文学出版社
store参数常用来结合expire命令缓存排序结果,伪代码如下:
# 判断是否存在之前排序结果的缓存
$isCacheExists = EXISTS cache.sort
if $isCacheExists is 1
# 如果存在直接返回
return lrange chache.sort 0, -1
else
# 如果不存在,则使用sort排序
$sortResult = sort some.list store cache.sort
# 设置缓存的过期时间为10分组
expire cache.sort, 600
# 返回排序结果
return $sortResult
4.3.6性能优化
sort是redis最强大最复杂的命令之一.sortd命令时间复杂度为O(n+mlog(m)),
其中n表示排序的的列表(集合或有序集合)中元素个数,m表示要返回的元素 个数.
当n较大是sort命令性能相对较低.所以开发中使用sort命令应注意以下几点:
- 尽可能减少待排序键中元素的数量(使n尽可能少)
- 使用limit参数只获取需要的数据(使m尽可能少)
- 如果排序的数据量较大,尽可能使用store参数将结果缓存