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     }