缓存中间件-redis的sort和limit的核心原理
世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
在redis中sort是如何实现的呢?
首先用两张图来表示:
图1.1 - redis排序之前
图1.2 - redis排序之后
由图1.1可以看出,在对集合排序之前,redis首先会创建一个与集合大小相等的redisSortObject数组,每一个redisSortObject元素都依次指向对应的集合元素。
redisSortObject数组中主要有两个元素,一个元素是obj,用来指向集合中对应的元素;另一个元素是u,用来记录集合中元素的值,其中,u.score记录的是数值类型,u.comobj指向的是字符串。
当redisSortObject数组创建完成以后,会根据快速排序的算法对集合元素的值进行排序,并且根据排序结果,redisSortObject数组的元素依次按排序的顺序指向集合中的元素,结果如图1.2所示。
在返回排序结果时,按照redisSortObject数组指向的顺序依次返回即可。
对于limit,就更简单了,在sort排序完成以后,根据limit的两个值 offset,count,从redisSortObject数组中从offset开始取count数量的数组返回即可。
这是redis排序的基本过程,字符串排序与数值排序过程一样,只是在排序时加了alpha标记,并且使用u.compobj指向对应的字符串值来代替u.score的直接存值。
实例如下:
# 数值排序
> rpush nums 3 5 4 6
(integer) 4
> lrange nums 0 3
3
5
4
6
> sort nums
3
4
5
6
# 字符串排序 后加 alpha
> sadd fruits apple cherry banana
(integer) 3
> sort fruits alpha
1) "apple"
2) "banana"
3) "cherry"
# 根据pattern排序(也是数值 3 6 2)
> mset apple-price 3 cherry-price 6 banana-price 2
OK
> sort fruits by *-price
1) "banana"
2) "apple"
3) "cherry"
# 根据pattern字符串排序
> mset apple-type fruits-2 cherry-type fruits-3 banana-type fruits-1
OK
> sort fruits by *-type alpha
1) "banana"
2) "apple"
3) "cherry"
# 倒序排序
> sort nums desc
1) "6"
2) "5"
3) "4"
4) "3"
# sort limit offset count
> sort nums limit 0 2
1) "3"
2) "4"
更多信息,请关注公众号:
上一篇: zookeeper 集群搭建
下一篇: JavaSE---01类与对象