废话不多说,直接上代码
package com.jjf.redis;
import org.junit.Assert;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.Tuple;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Created by jjf_lenovo on 2017/3/31.
*/
public class RedisSortedSet {
Jedis jedis = null;
static final String DATASOURCE_URL = "182.254.213.106";
static final int DATASOURCE_SORT = 6379;
static final String DATASOURCE_PASS = "123456";
static final int DATASOURCE_SELECT = 1;
public RedisSortedSet() {
//基本配置
jedis = new Jedis(DATASOURCE_URL, DATASOURCE_SORT);
jedis.auth(DATASOURCE_PASS);
jedis.select(DATASOURCE_SELECT);
}
@Test
public void testZAddAndZCardAndZScore(){
//zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
//zcard 返回有序集 key 的基数。
//zscore 返回有序集 key 中,成员 member 的 score 值。
jedis.zadd("sortedSet",1111,"value:10");
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<=10;i++){
map.put("value:"+i,Double.valueOf(i)); //覆盖了上面的赋值
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zscore("sortedSet","value:10")==10);
Assert.assertTrue(jedis.zcard("sortedSet")==11);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZCount(){
//zcount 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Long count = jedis.zcount("sortedSet",0,9);
System.out.println(count);
Assert.assertTrue(count==10);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZincrby(){
//zincrby 为有序集 key 的成员 member 的 score 值加上增量 increment 。
jedis.zadd("sortedSet",1111,"value:10");
jedis.zincrby("sortedSet",-111.1,"value:10");
Assert.assertTrue(jedis.zscore("sortedSet","value:10")==999.9);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRangeAndZRevRange(){
/** zrange
* 返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。 rev则相反
具有相同 score 值的成员按字典序(lexicographical order )来排列。
*/
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Math.random()*100);
}
jedis.zadd("sortedSet",map);
Set<String> set = jedis.zrange("sortedSet",0,-1); //递增
Set<String> revSet = jedis.zrevrange("sortedSet",0,-1); //递减
for(String ss:set){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
System.out.println("rev----------");
for(String ss:revSet){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRangeByScoreAndZRevRangeByScore(){
//返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
//有序集成员按 score 值递增(从小到大)次序排列。 rev递减
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Math.random()*100);
}
jedis.zadd("sortedSet",map);
Set<String> set = jedis.zrangeByScore("sortedSet",25,75);
Set<String> revSet = jedis.zrevrangeByScore("sortedSet",75,25);
for(String ss:set){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
System.out.println("rev----------");
for(String ss:revSet){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRankAndZRevRank(){
//zrank 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。从0开始,rev表示从大到小
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zrank("sortedSet","value:5")==5);
Assert.assertTrue(jedis.zrevrank("sortedSet","value:5")==4);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRem(){
//zrem 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zrem("sortedSet","value:0","value:1","dertcfghvjbk")==2);
Assert.assertTrue(jedis.zcard("sortedSet")==8);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRemRangeByRank(){
//zremrangeByRank 移除有序集 key 中,指定排名(rank)区间内的所有成员。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
jedis.zremrangeByRank("sortedSet",1,3);
Assert.assertTrue(jedis.zcard("sortedSet")==7);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRemRangeByScore(){
//zremrangeByScore 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
jedis.zremrangeByScore("sortedSet",1,3);
Assert.assertTrue(jedis.zcard("sortedSet")==7);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZUnionStore(){
//计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("keya",map);
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i+3));
}
map.put("adsad",123d);
jedis.zadd("keyb",map);
jedis.zunionstore("destination","keya","keyb");
Assert.assertTrue(jedis.zcard("destination")==11);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
}
@Test
public void testZInterStore(){
//计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i)); //覆盖了上面的赋值
}
jedis.zadd("keya",map);
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i+3)); //覆盖了上面的赋值
}
map.put("adsad",123d);
jedis.zadd("keyb",map);
jedis.zinterstore("destination","keya","keyb");
Assert.assertTrue(jedis.zcard("destination")==10);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
}
@Test
public void testZRangeByLex(){
//当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
// 而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员。
jedis.zadd("中文",123d,"a");
jedis.zadd("中文",123d,"b");
jedis.zadd("中文",123d,"c");
jedis.zadd("中文",123d,"d");
jedis.zadd("中文",123d,"e");
Set<String> set = jedis.zrangeByLex("中文","(b","[e");
// Set<String> set = jedis.zrangeByLex("中文","-","+");
// System.out.println(set.toString());
Assert.assertTrue(set.size()==3);
Assert.assertTrue(jedis.del("中文")==1);
}
@Test
public void testZLexCount(){
//对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会返回该集合中, 成员介于 min 和 max 范围内的元素数量。
jedis.zadd("key",123d,"a");
jedis.zadd("key",123d,"b");
jedis.zadd("key",123d,"c");
jedis.zadd("key",123d,"d");
jedis.zadd("key",123d,"e");
Assert.assertTrue(jedis.zlexcount("key","-","+")==5);
Assert.assertTrue(jedis.zlexcount("key","(b","[e")==3);
Assert.assertTrue(jedis.del("key")==1);
}
@Test
public void testZRemRangeByLex(){
//对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。
jedis.zadd("key",123d,"a");
jedis.zadd("key",123d,"b");
jedis.zadd("key",123d,"c");
jedis.zadd("key",123d,"d");
jedis.zadd("key",123d,"e");
Assert.assertTrue(jedis.zremrangeByLex("key","(b","[e")==3);
Assert.assertTrue(jedis.zlexcount("key","-","+")==2);
}
@Test
public void testZScan(){
Pipeline pipeline = jedis.pipelined();
for(int i=0;i<1000;i++){
pipeline.zadd("key",Math.random()*100,"value:"+i);
}
pipeline.sync();
int cursor = 0;
int count = 0;
do{
ScanResult<Tuple> result = jedis.zscan("key",cursor);
cursor = Integer.valueOf(result.getStringCursor());
for(Tuple tuple :result.getResult()){
// System.out.print(new String(tuple.getBinaryElement())+":"+tuple.getScore());
count++;
}
// System.out.println();
}
while (cursor!=0);
System.out.println(count);
Assert.assertTrue(count==1000);
Assert.assertTrue(jedis.del("key")==1);
}
}