欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

缓存中间件-redis的sort和limit的核心原理

程序员文章站 2022-04-05 19:43:00
...

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

在redis中sort是如何实现的呢?
首先用两张图来表示:
缓存中间件-redis的sort和limit的核心原理
图1.1 - redis排序之前

缓存中间件-redis的sort和limit的核心原理
图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"

更多信息,请关注公众号:
缓存中间件-redis的sort和limit的核心原理

相关标签: 中间件