1 //对Sorted-Sets操作 2 /** 3 * Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。 4 * 它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。 5 * 然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。 6 * 在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。 7 * 由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。 8 * @throws Exception 9 */ 10 @Test 11 public void testSorted_Sets() throws Exception { 12 jedis.flushAll(); 13 14 //添加一个分数为1的成员 15 jedis.zadd("myzset", 1, "one"); 16 17 Map<String,Double> map = new LinkedHashMap<String,Double>(); 18 map.put("two", (double) 2); 19 map.put("three", (double) 3); 20 //添加两个分数分别是2和3的两个成员。 21 jedis.zadd("myzset", map);//这个单独测一下 22 23 //0表示第一个成员,-1表示最后一个成员。返回的结果中包含每个成员 24 Set<String> zrange = jedis.zrange("myzset", 0, -1); 25 System.out.println("zrange="+zrange);//zrange=[one, two, three] 26 27 28 29 //获取成员one在Sorted-Set中的位置索引值。0表示第一个位置 30 Long zrank = jedis.zrank("myzset", "one"); 31 System.out.println("zrank = "+zrank);//zrank = 0 32 33 //成员four并不存在,因此返回null 34 System.out.println(jedis.zrank("myzset", "four"));//null 35 36 //#返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。 37 Long zcount = jedis.zcount("myzset", 1, 2); 38 System.out.println("zcount="+zcount);//zcount=2 39 40 //获取myzset键中成员的数量。 41 System.out.println(jedis.zcard("myzset"));//3 42 43 //删除成员one和two,返回实际删除成员的数量。 44 Long zrem = jedis.zrem("myzset", "one","two"); 45 System.out.println("zrem="+zrem);//zrem=2 46 47 //查看是否删除成功。 获取键中成员的数量 48 System.out.println(jedis.zcard("myzset"));//1 49 50 //获取成员three的分数。返回值是字符串形式。 51 Double zscore = jedis.zscore("myzset", "three"); 52 System.out.println("zscore="+zscore);//zscore=3.0 53 54 //由于成员two已经被删除,所以该命令返回null 55 System.out.println(jedis.zscore("myzset", "two"));//null 56 57 //将成员three的分数增加2,并返回该成员更新后的分数。 58 Double zincrby = jedis.zincrby("myzset", 2, "three"); 59 System.out.println("zincrby="+zincrby);//zincrby=5.0 60 61 //将成员three的分数增加-1,并返回该成员更新后的分数。 62 System.out.println(jedis.zincrby("myzset", -1, "three"));//4.0 63 64 //====================》》》》》》 65 jedis.del("myzset"); 66 67 Map<String,Double> map3 = new LinkedHashMap<String,Double>(); 68 map3.put("one", 1.0); 69 map3.put("two", 2.0); 70 map3.put("three", 3.0); 71 map3.put("four", 4.0); 72 //一次添加多个 73 jedis.zadd("myzset",map3); 74 75 //获取分数满足表达式1 <= score <= 2的成员。 76 Set<String> zrangeByScore = jedis.zrangeByScore("myzset", 1, 2); 77 System.out.println("zrangeByScore= "+zrangeByScore);////zrangeByScore= [one, two] 78 79 80 81 //删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。 82 Long zremrangeByScore = jedis.zremrangeByScore("myzset", 1, 2); 83 System.out.println("zremrangeByScore="+zremrangeByScore);//zremrangeByScore=2 84 85 //看出一下上面的删除是否成功。 86 System.out.println(jedis.zrange("myzset", 0, -1));//[three, four] 87 88 89 //删除位置索引满足表达式0 <= rank <= 1的成员。返回实际删除的数量 90 Long zremrangeByRank = jedis.zremrangeByRank("myzset", 0, 1); 91 System.out.println("zremrangeByRank="+zremrangeByRank);//zremrangeByRank=2 92 93 //查看上一条命令是否删除成功。 94 Long zcard = jedis.zcard("myzset"); 95 System.out.println("zcard = "+zcard);//zcard = 0 96 97 //======================>>>>>>>>>>>>>>>>> 98 99 jedis.del("myzset"); 100 Map<String,Double> map2 = new LinkedHashMap<String,Double>(); 101 map2.put("one", 1.0); 102 map2.put("two", 2.0); 103 map2.put("three", 3.0); 104 map2.put("four", 4.0); 105 //一次添加多个 106 jedis.zadd("myzset",map2); 107 108 //以位置索引从高到低的方式获取并返回此区间内的成员。 109 Set<String> zrevrange = jedis.zrevrange("myzset", 0, -1); 110 System.out.println("zrevrange="+zrevrange);//zrevrange=[four, three, two, one] 111 112 Set<String> zrevrange2 = jedis.zrevrange("myzset", 1, 3); 113 System.out.println("zrevrange2="+zrevrange2);//zrevrange2=[three, two, one] 114 115 //由于是从高到低的排序,所以one的位置是3。 116 System.out.println(jedis.zrevrank("myzset", "one"));//3 117 118 //由于是从高到低的排序,所以four的位置是0。 119 System.out.println(jedis.zrevrank("myzset", "four"));//0 120 121 //获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序。 122 System.out.println(jedis.zrevrangeByScore("myzset", 3, 0));//[three, two, one] 123 124 System.out.println("数据:="+jedis.zrange("myzset", 0, -1));//数据:=[one, two, three, four] 125 126 127 /** 128 * zrangeByScoreWithScores(String key, double min, double max, int offset, int count) 129 * key:键 130 * min:最小分值 131 * max:最大分值 132 * offset:偏移量,也就是从哪个位置开始。 133 * count:元素个数 134 * 135 * 返回的元素用ASCII码表示的,该元素的值用double类型数据表示 136 */ 137 System.out.println(jedis.zrangeByScoreWithScores("myzset", 2, 3, 0, 2));//[[[116, 119, 111],2.0], [[116, 104, 114, 101, 101],3.0]] 138 139 }