package com.wxy.Batch.API.redis;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
/**
* @author wxy E-mail:
[email protected]
* @date 创建时间: 2017年9月18日上午9:50:13
* @version 1.0
* @parameter
* @description 描述: 有序集合, 是键值对, 但是不同于hash键值对的是, 键不能重复, 保证我唯一, 每个值是一个分数, 不是其他类型的. 可以根据值进行排序, 运算.
*
*/
public class Api_Jedis_Socket_set {
Jedis jedis = new Jedis("192.168.80.80");
@Before
public void before(){
String pong = jedis.ping();
System.out.println(pong);
}
@Test
public void test01(){
Map<String, Double> zmap = new HashMap<String, Double>();
zmap.put("张三", (double) 78);
zmap.put("李四", (double) 99);
zmap.put("王五", (double) 88);
zmap.put("赵六", (double) 57);
zmap.put("小八", (double) 57);
//向有序集合中添加元素.
Long zadd = jedis.zadd("wxy-zset", zmap );
System.out.println(zadd);
Long zcard = jedis.zcard("wxy-zset");//查看有序集合中有多少个元素.
System.out.println(zcard);
//获取分数在 min <= score <= max 之间的分数的 元素个数
String min = "88";
String max = "99";
Long zcount = jedis.zcount("wxy-zset", min , max );
System.out.println(zcount);
//如果想要获取开区间的值, 比如大于最小值 为(min 小于最大值 为(max
//所以求大于最小值, 小于最大值的 元素个数(也就是去掉等于这种情况, 变成了开区间) 则
min = "(88";
max = "(98";
Long zcount2 = jedis.zcount("wxy-zset", min , max );
System.out.println(zcount2);
}
@Test
public void test02(){
//获取wxy-zset中的所有元素.
long start = 0;//表示从第一个元素开始
long end = -1;//表示到最后一个元素.
Set<String> zrange = jedis.zrange("wxy-zset", start, end);
for (String string : zrange) {
System.out.println(string); //结果为:赵六 张三 王五 李四
}
System.out.println("--------------------------------------------------");
//改变上面代码的结果顺序(倒序);
Set<String> zrevrange = jedis.zrevrange("wxy-zset", 0, -1);
for (String string : zrevrange) {
System.out.println(string);
}
System.out.println("--------------------------------------------------");
//通过分数来获取元素.
String min = "88";
String max = "99";
Set<String> zrangeByScore = jedis.zrangeByScore("wxy-zset", min, max);
for (String string : zrangeByScore) {
System.out.println(string);
}
System.out.println("----------------------============-----------------------");
//将上面的代码也倒序, 通过score查找出来的倒序显示;
Set<String> zrevrangeByScore = jedis.zrevrangeByScore("wxy-zset", max, min);//注意参数顺序跟上面不一样.
for (String string : zrevrangeByScore) {
System.out.println(string);
}
}
@Test
public void test03(){
//获取指定成员的位置;
Long zrank = jedis.zrank("wxy-zset", "王五");
System.out.println(zrank);
//获取指定成员的成绩
Double zscore = jedis.zscore("wxy-zset", "王五");
System.out.println(zscore);
//将指定成员删除()
Long zrem = jedis.zrem("wxy-zset", "张三", "李四");
System.out.println(zrem);
}
@Test
public void test04(){
//删除其中 一段的元素
Long zremrangeByRank = jedis.zremrangeByRank("wxy-zset", 0, 2);//从第0位置到第2位置的 这一段元素删掉(一共三个).
System.out.println(zremrangeByRank);
//删除某一分数段之间的元素.
Long zremrangeByScore = jedis.zremrangeByScore("wxy-zset", "(88", "99");
System.out.println(zremrangeByScore);
}
@Test
public void get(){
//获取所有成员 以及对应的分数. 复习上面的方法总结:
Set<String> zrange = jedis.zrange("wxy-zset", 0, -1);
for (String range : zrange) {
Double zscore = jedis.zscore("wxy-zset", range);
System.out.println(range + "_____________" + zscore);
}
}
@Test
public void test05(){
//当有序集合中, 键值对的值有重复, 键不重复. (键值对不能全部重复). 举个场景:统计一个班级的成绩, 有多个人的成绩都是60, 但是每个人名字不一样.
//在有序集合中, 像这种情况, 他的键会根据数据字典进行排序存储的.
Map<String, Double> members = new HashMap<>();
members.put("同学1", (double) 60);
members.put("同学2", (double) 60);
members.put("同学3", (double) 60);
members.put("同学4", (double) 60);
members.put("同学5", (double) 60);
members.put("同学6", (double) 60);//假设有六个同学的分数一样的 //而且, 下面这种方法,必须是在分数一样的情况下才有意义.
Long zadd = jedis.zadd("wxy-zset", members);
System.out.println(zadd);
String min = "(同学1";//注意这种小括号或者中括号一定要有的, 因为是表示一个区间. 否则报错.
String max = "[同学6";
Set<String> zrangeByLex = jedis.zrangeByLex("wxy-zset", min, max);
System.out.println(zrangeByLex);
for (String range : zrangeByLex) {
Double zscore = jedis.zscore("wxy-zset", range);
System.out.println(range + "_____________" + zscore);
}
}
}