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 java.util.List;
import java.util.Set;
/**
* Created by jjf_lenovo on 2017/3/31.
*/
public class RedisSetTest {
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 RedisSetTest(){
//基本配置
jedis = new Jedis(DATASOURCE_URL,DATASOURCE_SORT);
jedis.auth(DATASOURCE_PASS);
jedis.select(DATASOURCE_SELECT);
}
@Test
public void testSAdd(){
//sadd 將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
Assert.assertTrue(jedis.sadd("set","a")==1);
Assert.assertTrue(jedis.sadd("set","a","b","c")==2);
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSCard(){
//scard 返回集合 key 的基數(集合中元素的數量)。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.scard("set".getBytes())==3);
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSDiff(){
//sdiff 返回一個集合的全部成員,該集合是所有給定集合之間的差集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Set<String> a = jedis.sdiff("set","SET");//是找出set中,SET沒有的元素,多級的話,一個個比
Set<String> b = jedis.sdiff("SET","set");//是找出SET中,set沒有的元素,多級的話,一個個比
System.out.println(a.toString()+":::"+b.toString());
Assert.assertTrue(jedis.del("set","SET")==2);
}
@Test
public void testSDiffStore(){
//sdiffstore 這個命令的作用和 SDIFF 類似,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Assert.assertTrue(jedis.sdiffstore("store","SET","set")==3);
Assert.assertTrue(jedis.sdiffstore("store","set","SET")==0);
Assert.assertTrue(jedis.del("set","SET")==2);
}
@Test
public void testSInter(){
//sinter 返回一個集合的全部成員,該集合是所有給定集合的交集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Set<String> set = jedis.sinter("set","SET");
System.out.println(set.toString());
Assert.assertTrue(set.size()==3);
Assert.assertTrue(jedis.del("set","SET")==2);
}
@Test
public void testSInterStore(){
//sinterstore 這個命令類似於 SINTER 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Assert.assertTrue(jedis.sinterstore("store","set","SET")==3);
Assert.assertTrue(jedis.del("set","SET","store")==3);
}
@Test
public void testSIsMember(){
//sismember 判斷 member 元素是否集合 key 的成員。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sismember("set","b"));
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSMembers(){
//smembers 返回集合 key 中的所有成員。 不存在的 key 被視為空集合。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Set<String> set = jedis.smembers("set");
System.out.println(set.toString());
Assert.assertTrue(set.size()==3);
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSMove(){
//將 member 元素從 source 集合移動到 destination 集合。 (原子操作)
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Assert.assertTrue(jedis.smove("set","SET","a")==1);
Set<String> a = jedis.smembers("set");
Set<String> b = jedis.smembers("SET");
System.out.println(a.toString());
System.out.println(b.toString());
Assert.assertTrue(a.size()==2);
Assert.assertTrue(b.size()==6);//因為原本就存在a ,所以還是6個
Assert.assertTrue(jedis.del("set","SET")==2);
}
@Test
public void testSPop(){
//spop 移除並返回集合中的一個隨機元素。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
System.out.println(jedis.spop("set"));
Set<String> a = jedis.smembers("set");
Assert.assertTrue(a.size()==2);
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSRandMember(){
/**
* 如果命令執行時,只提供了 key 參數,那么返回集合中的一個隨機元素。
從 Redis 2.6 版本開始, SRANDMEMBER 命令接受可選的 count 參數:
如果 count 為正數,且小於集合基數,那么命令返回一個包含 count 個元素的數組,數組中的元素各不相同。如果 count 大於等於集合基數,那么返回整個集合。
如果 count 為負數,那么命令返回一個數組,數組中的元素可能會重復出現多次,而數組的長度為 count 的絕對值。
*/
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
System.out.println(jedis.srandmember("set"));//不同於spop,srandmember不移除
Set<String> a = jedis.smembers("set");
Assert.assertTrue(a.size()==3);
//測試多個隨機數
List<String> lista = jedis.srandmember("set",2);//返回兩個不重復的隨機數
System.out.println("lista:"+lista.toString());
List<String> listb = jedis.srandmember("set",5);//5>3 返回全部數據
System.out.println("listb:"+listb.toString());
List<String> listc = jedis.srandmember("set",-2); //返回|-2|個可以重復的數據
System.out.println("listc:"+listc.toString());
List<String> listd = jedis.srandmember("set",-6); //返回|-6|個可以重復的數據
System.out.println("listd:"+listd.toString());
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSRem(){
//srem 移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.srem("set","a","d")==1);
Assert.assertTrue(jedis.del("set")==1);
}
@Test
public void testSunion(){
//sunion 返回一個集合的全部成員,該集合是所有給定集合的並集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Set<String> set = jedis.sunion("set","SET");
System.out.println(set.toString());
Assert.assertTrue(set.size()==6);
Assert.assertTrue(jedis.del("set","SET")==2);
}
@Test
public void testSunionStore(){
//sunion 返回一個集合的全部成員,該集合是所有給定集合的並集。
Assert.assertTrue(jedis.sadd("set","a","b","c")==3);
Assert.assertTrue(jedis.sadd("SET","A","B","C","a","b","c")==6);
Assert.assertTrue(jedis.sunionstore("store","set","SET")==6);
Assert.assertTrue(jedis.del("set","SET","store")==3);
}
@Test
public void testSScan(){
Pipeline pipeline = jedis.pipelined();
for(int i=0;i<1000;i++){
pipeline.sadd("set",String.valueOf(i));
}
pipeline.sync();
ScanResult<String> result ;//= jedis.sscan("set",0);
// System.out.println(result.getResult().size()+"::"+result.getStringCursor());
// System.out.println(result.getResult().toString());
int count = 0;
int cursor = 0;
do{
// System.out.println(result.getCursor());
result = jedis.sscan("set",cursor);
cursor = Integer.valueOf(result.getStringCursor());
for (String ss : result.getResult()) {
count++;
System.out.print("<"+count+":" + ss + ">");
}
System.out.println();
}
while(cursor!=0);
System.out.println(count);
Assert.assertTrue(count==1000);
Assert.assertTrue(jedis.del("set","SET","store")==1);
}
}