zoukankan      html  css  js  c++  java
  • Redis-技术专区-让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】

    前言介绍

    很多小伙伴都跟我说,redis中,ZSet(有序集合)是他们最陌生的集合,同时也是觉得特别复杂的集合之一,在开发过程中经常会用到它,而且也是大家最不太有把握使用的集合,所以笔者就从ZSet集合开始去讲解Redis的集合的使用指南,希望可以帮助大家!

    有序集合

    ZSET(有序集合)的概念

    有序集合(ZSET):是像集合(SET)一样可以装很多东西,只不过集合装的是字符串而有序集合(ZSET)装的是键值对,从更严谨的角度讲,有序集合和散列更接近只不过有序集合是有序的,有点像TreeSet

    ZSET(有序集合)的定义

    有序集合(ZSet):它是一个存储着成员(member)本身对象值以及和它对应的分值(score)的键值对,并且按照分值从小到大自动排序。对应的具体的数据结构,

    • 有序集合的键被称为成员(member)每个成员各不相同
    • 有序集合的值被称为分值(score),分值必须是浮点数

    ZADD命令:

    • 它的全称叫做:zset add,将给定分值的成员添加到有序集合里面

    • 因为有序集合是自排序的,所以也不像列表一样有左插入或右插入

    指令:
    # zadd key score value
    zadd zset-weight 60 Kelvin
    
    java代码
    System.out.println(conn.zadd("zset-weight",60,"Kelvin"));
    
    作用

    往zset-weight这个有序集合中添加Kelvin-60这个键值对

    返回
    • “1” 存入成功
    • “0” 存入失败,zset-weight已经存在该键值对
    注意

    有序集合的不一样的地方就在于,将分值写在前面,因为有序集合是要根据分值来进行排序的,默认从小到大(正序 ASC)

    其他案例
    zadd zset-weight 40 Lina
    zadd zset-weight 50 Oscar
    zadd zset-weight 70 Mike
    

    执行完了存储,我们接下来,如何删除元素?

    ZREM(移除)

    ZREM全称zset remove,从有序集合里面移除给定的成员,并返回被移除成员的数量

    指令
    zrem zset-weight Mike
    
    • 作用:移除zset-weight中键为Mike的元素
    • 返回:"1" 表示移除元素数量为1
    System.out.println(conn.zrem("zset-weight","Mike"));
    

    ZCARD

    ZCARD全称zset card,返回有序集合包含的成员数量

    指令
    zcard high
    
    java代码
    System.out.println(conn.zadd("high",180,"Kelvin"));
    System.out.println(conn.zadd("high",160,"Lina"));
    System.out.println(conn.zadd("high",177,"Mike"));
    System.out.println(conn.zcard("high"));
    

    zcard命令返回3.


    ZINCRBY

    ZINCRBY全称zset increase by,将成员的分值加上一个给定数。

    System.out.println(conn.zincrby("high",2,"Kelvin"));
    

    ZCOUNT

    ZCOUNT全称zset count,返回分值在[min,max]之间的成员数量

    System.out.println(conn.zcount("high",165,190));
    

    ZRANK

    ZRANK全称zset rank,返回成员在有序集合中的排名

    System.out.println(conn.zrank("high","Kelvin"));
    

    ZSCORE

    ZSCORE全称zset score,返回成员的分值

    System.out.println(conn.zscore("high","Kelvin"));
    

    ZRANGE(获取)

    • ZRANGE全称:zset range key start end [WITHSCORES] ,取出zset-weight中索引值在[start,end]之间的成员,即该范围内的键值对,如果给定了可选WITHSCORES的选项,那么命令会将成员的分值也一并返回。

    • 如果希望全部取出来,可以采用start=0,end=-1,可以看出来是一个环路,前开后闭。如果start选择了1,就无法获取第一个,拿出来的数据会少一个!而end=-1 则则说明获取到最后一个

    指令:
    zrange key start end withscores
    zrange zset-weight 0 -1 withscores
    
    返回
      (1)"Lina"
      (2)"40"
      (3)"Oscar"
      (4)"50"
      (5)"Kelvin"
      (6)"60"
      (7)"Mike"
      (8)"70"
    

    我们现在选择选出排名第3到第6之间的数据,(3,6]

    System.out.println(conn.zrange("high",3,6));
    

    因为zrange的范围是左开右闭,那么如果我们想拿到(3,6]并且拿到这些的分值。

    System.out.println(conn.zrangeWithScores("high",3,6));
    

    ZRANGEBYSCORE

    ZRANGEBYSCORE全称zset range by score,它与zrange相比较区别在于根据分值范围来获取,返回有序集合中分值介于min和max之间的所有成员

    需求场景

    我们挑出分值在160到180之间的成员

    指令
    zrangebyscore key start end [withscores]
    zrangebyscore zset-weight 160 180 withscores
    
    java代码
    System.out.println(conn.zrangeByScore("high",160,180));
    
    作用

    取出分值在[0,60]之间的键值对

    返回
        (1)"Lina"
    	(2)"40"
    	(3)"Oscar"
    	(4)"50"
    	(5)"Kelvin"
    	(6)"60"
    

    ZREVRANGE

    ZREVRANGE全称zset reverse range,返回有序集合给定排名范围内的成员,成员按照分值从大到小排列

    指令
    zrevrange key start end withscores
    zrevrange zset-weight 0 -1 withscores
    
    java代码
    System.out.println(conn.zrevrange("high",1,5));
    

    ZREVRANGEBYSCORE

    ZREVRANGEBYSCORE全称·zset reversal range by score,获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回。

    指令

    倒序获取160到180 的位置,注意此时 180 是开始坐标 160是结束坐标

    zrevrangebyscore key start end 
    zrevrangebyscore high 180 160
    
    Java代码
    System.out.println(conn.zrevrangeByScore("high",180,160));
    

    ZREVRANK

    ZREVRANK全称zset reversal rank,返回成员在有序集合里的排名,按照分值从大到小排列,默认的是从小到大,这里翻转了一下。

    假设,“Kelvin”排第6,“Yellow”排第3,但是从逆向来看,“Kelvin”为0,“Yellow”为3,那么我们写行代码查看一下。

    System.out.println(conn.zrevrank("high","Yellow"));
    System.out.println(conn.zrevrank("high","Kelvin"));
    

    ZREMRANGEBYRANK

    ZREMRANGEBYRANK全称zset remove range by rank,移除有序集合中排名介于start和stop之间的所有成员

    在移除之间先查看一下redis中的数据

    运行Java代码
    System.out.println(conn.zremrangeByRank("high",2,4));
    

    返回被移除的数量

    ZREMRANGENYSCORE

    ZREMRANGEBYSCORE全称zset remove range by score移除有序集合中排名分值介于start和stop之间的所有成员

    为了演示方便,我们将在high有序集合中多添加几行数据

    System.out.println(conn.zadd("high",174,"Jay"));
    System.out.println(conn.zadd("high",169,"Pei"));
    System.out.println(conn.zadd("high",186,"Jone"));
    

    然后移除分值170以内的成员

    System.out.println(conn.zremrangeByScore("high",0,170));
    

    ZINTERSTORE

    ZINTERSTORE全称zset inter store,对给定的有序集合做交集运算,默认使用的聚合函数为sum,即默认在做交集操作时将不同集合中相同的成员所对应的分值相加,然后聚合成一个新的有序集合。

    ZUNIONSTORE

    ZUNIONSTORE全称zset union store,对给定的有序集合做并集运算,同样并集运算的聚合函数也可以选用“max”,"min"和“sum”。为了避免重复性说明,我们选用max来做一次并集示范。

    极限就是为了超越而存在的
  • 相关阅读:
    Chapter 4 持久存储数据对象
    pyhton Chapter3 读文件
    python笔记1
    C#读写txt文件
    机器学习第一讲
    Json对象
    表单加载
    多列树
    Java 基础【11】@注解
    Java 基础【06】复合赋值运算
  • 原文地址:https://www.cnblogs.com/liboware/p/15233559.html
Copyright © 2011-2022 走看看