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 }
