Redis-带你深入学习数据类型zset

目录

1、zset有序集合

2、zset相关命令

2.1、添加或更新指定的元素——zadd

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

2.3、返回指定区间元素相关命令:zrange、arevrange、zrangebyscore

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

2.5、返回指定元素的排名——zrank、zrevrank

2.6、返回指定元素的分数——zscore

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

2.8、集合间操作:zinterstore、zunionstore

3、应用场景


1、zset有序集合

         zset中使用的是member和score【score为一个浮点数】,而不是键值对key value;

score member和key vlaue的区别;score有两个特殊取值:inf 无穷大 ,-inf无穷小 ---二者的绝对值都是无限大的~

  • member score:既可以通过member找score,也可以通过score找member
  • key value:只能通过key来找对应的value

zset的特点:

  • 有序的---按照分数升序排列,分数score相同的按照member的字典序排列
  • member值需要唯一,score可以不唯一

2、zset相关命令

2.1、添加或更新指定的元素——zadd

  • zadd:添加或更新指定的元素以及关联的分数到zset中
  • 语法:zadd key [ NX | XX ] [ CH ] [ INCR ] score member [score member...]
  • 参数说明1:[NX |XX]:不添加此参数时,默认为如果member存在,则更新score值,如不存在,则会添加member;NX:如果member存在则直接返回,不存在则新增member;XX:如果member存在则更新score,不存在则直接返回
  • 参数说明2:CH:修改返回值,默认返回值为新增member的个数,添加该参数后,返回值为新增member的个数加上score被修改的个数
  • 参数说明3:INCR:给指定的某一个score加上指定的值,注意:该参数一次只能操作一个member;使用该参数时,返回被修改为:返回的是给定的score加上指定值后,新的score的值
  • 参数说明4:[score member...]--->支持一次添加或指定更新多个member
  • 参数补充:更新版本的Redis,添加了一个参数:[LT | GT]。默认是若member存在,则修改score;LT:less than--member存在时,更新score,只有当给定的新的分数小于原来的分数才能修改成功;greater than--member存在时,更新score,只有当给定的新的分数大于原来的分数才能修改成功
  • 返回值:默认为新增成功的元素个数,特殊情况在上述的参数说明已经提及了~
  • 时间复杂度:logN--zset内部数据结构主要是跳表,每次新增或修改后,内部都会进行再次排序,保证zset内部一直是有序的,具体怎么推导出时间复杂度是logN,后续文章会持续更新的~

举例:

Redis-带你深入学习数据类型zset_第1张图片

Redis-带你深入学习数据类型zset_第2张图片

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

zcard:获取一个zset的基数,也就是zset中某个key的元素个数

  • 语法:zcard key
  • 返回值:zset中某key中的元素个数
  • 时间复杂度O(1)

举例:

Redis-带你深入学习数据类型zset_第3张图片

zount:获取指定分数区间内的元素个数

  • 语法:zount key min max
  • 参数说明:min和max都是默认包含的,不想包含的话,需要在min或max左边加上左括号(
  • 返回值:指定区间的元素个数
  • 时间复杂度O(logN)----根据min找到对应的元素,再根据max找到对应的元素,查询到元素后就可以获取到他的次序,也就是下标,直接对应下标相减即可~

举例:

Redis-带你深入学习数据类型zset_第4张图片

2.3、返回指定区间元素相关命令:zrange、zrevrange、zrangebyscore

zrange:返回指定区间内的元素,按分数升序排列

  • 语法:zrange key start stop [withscores]
  • 参数说明:默认返回member值,加上该参数后,会带着分数一起返回;start sotp支持负数
  • 返回值:区间内元素的列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

Redis-带你深入学习数据类型zset_第5张图片

zrevrange:返回指定区间内的元素,按照分数降序排列---注意这里的按照降序是,将原本的整个zset先进行降序排列,具体下标也会随之变化,例如原本ll是在下标为len-1的地方,降序调整后,ll是在下标为0的地方~

  • 语法:zrevrange key start stop [withscores]
  • 返回值:区间内的元素列表
  • 时间复杂度:O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

Redis-带你深入学习数据类型zset_第6张图片

zrangebyscore:返回某分数段之间的元素

  • 语法:zrangescore key min max [withscores] 
  • 参数说明1:默认为闭区间,使用 ( 可以调整为开区间
  • 返回值:区间内的元素列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数
  • 该命令在6.2.0之后的版本中废弃了,功能合并至zrang命令中

举例:

Redis-带你深入学习数据类型zset_第7张图片

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

zpopmax:删除并返回分数最高的count个元素,默认为1

  • 语法:zpopmax key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例;

Redis-带你深入学习数据类型zset_第8张图片

zpopmin:删除并返回分数最低的count个元素,默认为1

  • 语法:zpopmin key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例:

Redis-带你深入学习数据类型zset_第9张图片

bzpopmax:zpopmax阻塞版本

  • 语法:bzpopmax key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

bzpopmin:zpopmin阻塞版本

  • 语法:bzpopmin key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

zrem:删除指定元素

  • 语法:zrem key member [member...]
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(M*log(N))-----N:整个集合中元素个数;M:member的个数

举例;

Redis-带你深入学习数据类型zset_第10张图片

zremrangebyrank:按照升序,删除指定范围的元素

  • 语法:zremrangebyrank key start stop
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

Redis-带你深入学习数据类型zset_第11张图片

zremrangebyscore:按照分数删除指定区间范围的元素

  • 语法:zremrangebyscore key min max
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

Redis-带你深入学习数据类型zset_第12张图片

2.5、返回指定元素的排名——zrank、zrevrank

zrank:返回指定元素的排名-升序

  • 语法:zrank key member
  • 返回值:该member的排名
  • 时间复杂度:O(logN)

举例:

Redis-带你深入学习数据类型zset_第13张图片

zrevrank:返回指定元素的排名-降序【集合以降序排列,指定元素的排名】

  • 语法:zrevrank key member
  • 返回值:排名
  • 时间复杂度:O(logN)

举例:

Redis-带你深入学习数据类型zset_第14张图片

2.6、返回指定元素的分数——zscore

  • zscore:返回指定元素的分数
  • 语法:zscore key member
  • 返回值:分数
  • 时间复杂度:O(1)----这里也是要进行查询操作,为什么时间复杂度不是O(logN)呢?因为redis中对于这样的查询操作做了特殊优化,付出了额外的空间代价~

举例:

Redis-带你深入学习数据类型zset_第15张图片

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

  • 语法:zincrby key incrment member
  • 返回值:增加后元素的分数
  • 时间复杂度:O(logN)

举例:

Redis-带你深入学习数据类型zset_第16张图片

2.8、集合间操作:zinterstore、zunionstore

zinterstore:几个集合的交集,并将结果保存到另一个key中

  • 语法:zinterstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明1:destination指的是交集结果存入到的目标key
  • 参数说明2:numkeys指的是个数,后面有多少个key的个数。因为后面可能还有会其它参数,为了将key值与其他的参数做区分~
  • 参数说明3:weights-->指的是指定每个key所占的权重,看下图举例中的最后一个命令,weights后面跟了一个 1 和 4,意思就是给前面对应位置的key1乘1,对应的key2乘4~【在应用场景排行榜中,例如总综测成绩排名可能涉及到成绩,和课外活动,而成绩占比百分之七十,课外活动占三十,就可以使用这个命令来解决此类问题】
  • 参数说明4:AGGREATE-->解决的是在取交集时,number相同而score不同时,应当以谁为准,sum指score相加,min取最大小的score,max取最大的score【默认取sum】
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N*K)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数

举例:

Redis-带你深入学习数据类型zset_第17张图片

zunionstore:几个集合的并集,并将结果保存到另一个key中

  • 语法:zunionstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明:同上zinterstore~
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数  【上一个命令zinterstore命令的时间复杂度,k一般不会太大,可看为1,这样看两个命令的时间复杂度就是一样的了~】

举例:

Redis-带你深入学习数据类型zset_第18张图片


3、应用场景

        排行榜——使用redis的zset实现排行榜,能够实时的保证排行榜的更新~

好啦,下期见咯~

你可能感兴趣的:(Redis,redis,学习,数据库)