1. Jedis Set Demos

对应redis命令参考:redis set组命令

package samples.cache.jedis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Set;

import redis.clients.jedis.Jedis;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

/**
 * @author Zi Lai Ye
 * @date 2017/10/16
 */
public class JedisSetTests {
    public static final Logger logger = LoggerFactory.getLogger(JedisListTests.class);

    public static final String HOST = "localhost";
    public static final int PORT = 6379;

    private Jedis jedis;

    public static final String skey1 = "skey1";
    public static final String skey2 = "skey2";

    public static final String key1 = "key1";


    public static final Long ONE = 1L;
    public static final Long ZERO = 0L;

    @Before
    public void beforeClass() {
        jedis = new Jedis(HOST, PORT);
//        jedis.flushDB();
    }

    @After
    public void afterClass() {
//        jedis.flushDB();
        jedis.close();
    }

    @Test
    public void sadd() {
        if (jedis.exists(skey1)) {
            jedis.del(skey1);
        }

        // key 不存在, 会自动创建的
        Long saddResult = jedis.sadd(skey1, "a");
        assertEquals(ONE, saddResult);

        // 如果添加的元素已存在, 不会重复再添加
        saddResult = jedis.sadd(skey1, "a");
        assertEquals(ZERO, saddResult);
        assertEquals(ONE, jedis.scard(skey1));

        // 如果类型不是set
        jedis.set(key1, "v1");

        try {
            saddResult = jedis.sadd(key1, "b");
        } catch (Exception e) {
            logger.error("key 类型不是set类型, 报错:", e);
        }
    }

    @Test
    public void scard() {
        delIfExists(skey1);

        // key 不存在, 返回 0
        Long scardResult = jedis.scard(skey1);
        assertEquals(ZERO, scardResult);

        initSset1();

        scardResult = jedis.scard(skey1);
        assertEquals(Long.valueOf(10), scardResult);

        // key 不是set类型, 报错
        jedis.set(key1, "v1");

        try {
            jedis.scard(key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    // 求在集合A中并不在集合B、C中的差集
    @Test
    public void sdiff() {
        delIfExists(skey1);
        delIfExists(skey2);

        // key1 不存在, 则其与任何集合的差集都是空集
        Set<String> sdiff = jedis.sdiff(skey1);
        assertNotNull(sdiff);
        assertEquals(0, sdiff.size());

        // key2 初始化 4-7
        for (int i = 4; i < 7; i++) {
            jedis.sadd(skey2, String.valueOf(i));
        }

        // key2 存在, key1不存在, key1 diff key2 还是空
        sdiff = jedis.sdiff(skey1, skey2);
        assertEquals(0, sdiff.size());

        // key1 初始化 1-5
        for (int i = 1; i <= 5; i++) {
            jedis.sadd(skey1, String.valueOf(i));
        }

        // 只传 key1, 不传被比较的 set, 返回 set1自身
        sdiff = jedis.sdiff(skey1);
        assertEquals(5, sdiff.size());

        // 返回在 set1 中存在, set2中不存在的元素组成的集合
        sdiff = jedis.sdiff(skey1, skey2);
        assertEquals(3, sdiff.size());
        assertTrue(sdiff.contains(String.valueOf(1)));
        assertTrue(sdiff.contains(String.valueOf(2)));
        assertTrue(sdiff.contains(String.valueOf(3)));

        // 如果参数中的任意一个 key 不是 set 类型, 报错
        jedis.set(key1, "v1");

        try {
            jedis.sdiff(key1, skey2);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
        try {
            jedis.sdiff(skey1, key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    // 求集合的交集
    @Test
    public void sinter() {
        delIfExists(skey1);
        delIfExists(skey2);

        // 任意一个 key 为空集, 交集即为空集
        Set<String> sinter = jedis.sinter(skey1);
        assertEquals(0, sinter.size());

        // key2 初始化 4-7
        for (int i = 4; i < 7; i++) {
            jedis.sadd(skey2, String.valueOf(i));
        }

        sinter = jedis.sinter(skey1, skey2);
        assertEquals(0, sinter.size());

        sinter = jedis.sinter(skey2, skey1);
        assertEquals(0, sinter.size());

        // key1 初始化 1-5
        for (int i = 1; i <= 5; i++) {
            jedis.sadd(skey1, String.valueOf(i));
        }

        // 取 set1 和 set2 的交集, 即4、5两个元素
        sinter = jedis.sinter(skey1, skey2);
        assertEquals(2, sinter.size());
        assertTrue(sinter.contains(String.valueOf(4)));
        assertTrue(sinter.contains(String.valueOf(5)));

        // 参数任意一个key不是set类型,报错
        jedis.set(key1, "");

        try {
            jedis.sinter(key1, skey1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
        try {
            jedis.sinter(skey1, key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    // 求集合的并集
    @Test
    public void sunion() {
        delIfExists(skey1);
        delIfExists(skey2);

        // 不存在的 key 被认定为空集合, 两个空集合的并集 还是空
        Set<String> sunion = jedis.sunion(skey1);
        assertEquals(0, sunion.size());

        sunion = jedis.sunion(skey1, skey2);
        assertEquals(0, sunion.size());

        // key2 初始化 4-7
        for (int i = 4; i < 7; i++) {
            jedis.sadd(skey2, String.valueOf(i));
        }

        sunion = jedis.sunion(skey1, skey2);
        assertEquals(4, sunion.size());

        // key1 初始化 1-5
        for (int i = 1; i <= 5; i++) {
            jedis.sadd(skey1, String.valueOf(i));
        }

        // 并集为 1-7
        sunion = jedis.sunion(skey1, skey2);
        assertEquals(7, sunion.size());

        // key 为 非set类型, 报错
        jedis.set(key1, "v1");

        try {
            jedis.sunion(key1, skey1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void sismember() {
        delIfExists(skey1);

        // key 不存在, 认为是空集合, 元素不在集合内, 返回false
        assertFalse(jedis.sismember(skey1, "1"));

        // 使用1-10元素初始化集合
        initSset1();

        // 判断元素是否在集合内
        for (int i = 1; i <= 10; i++) {
            assertTrue(jedis.sismember(skey1, String.valueOf(i)));
        }
        assertFalse(jedis.sismember(skey1, "a"));

        // key 不是set类型
        jedis.set(key1, "v1");
        try {
            jedis.sismember(key1, "a");
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void smembers() {
        delIfExists(skey1);

        // key 不存在, 返回空
        Set<String> smembers = jedis.smembers(skey1);
        assertNotNull(smembers);
        assertEquals(0, smembers.size());

        // 1-10初始化skey1
        initSset1();

        smembers = jedis.smembers(skey1);
        assertEquals(jedis.scard(skey1), Long.valueOf(smembers.size()));
        for (int i = 1; i <= 10; i++) {
            assertTrue(smembers.contains(String.valueOf(i)));
        }

        // key 不是 set 类型, 返回错误
        jedis.set(key1, "v1");
        try {
            jedis.smembers(key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void smove() {
        delIfExists(skey1);
        delIfExists(skey2);

        // skey1 skey2 都不存在, 不做任何操作
        Long smove = jedis.smove(skey1, skey2, "1");
        assertEquals(ZERO, smove);

        // key1 初始化 1-5
        for (int i = 1; i <= 5; i++) {
            jedis.sadd(skey1, String.valueOf(i));
        }

        // destination 不存在, 创建之
        smove = jedis.smove(skey1, skey2, "1");
        assertEquals(ONE, smove);
        assertEquals(ONE, jedis.scard(skey2));
        assertEquals(Long.valueOf(4), jedis.scard(skey1)); // set1 减 1个
        assertFalse(jedis.smembers(skey1).contains("1"));

        // destination 中已存在 member, 从source中移除, destination 不添加
        jedis.sadd(skey1, "1");
        assertTrue(jedis.smembers(skey1).contains("1"));
        assertTrue(jedis.smembers(skey2).contains("1"));

        smove = jedis.smove(skey1, skey2, "1");
        assertEquals(ONE, smove);
        assertFalse(jedis.smembers(skey1).contains("1"));

        // key 不是 set 报错
        jedis.set(key1, "v1");

        try {
            jedis.smove(key1, skey2, "1");
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
        try {
            jedis.smove(skey1, key1, "1");
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void spop() {
        delIfExists(skey1);

        // key 不存在, 返回 null 或 空集合
        assertNull(jedis.spop(skey1));
        Set<String> spop = jedis.spop(skey1, 1);
        assertNotNull(spop);
        assertEquals(0, spop.size());

        // 1-10初始化
        initSset1();

        // 不带count参数
        String spopResult = jedis.spop(skey1);
        assertNotNull(spopResult);
        assertEquals(Long.valueOf(9), jedis.scard(skey1));

        // 带count参数
        spop = jedis.spop(skey1, 3);
        assertNotNull(spop);
        assertEquals(3, spop.size());
        assertEquals(Long.valueOf(6), jedis.scard(skey1));

        // key 不是集合
        jedis.set(key1, "v1");
        try {
            jedis.spop(key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void srandmember() {
        delIfExists(skey1);

        // key 不存在, 返回 null 或 空集合
        assertNull(jedis.srandmember(skey1));
        assertEquals(0, jedis.srandmember(skey1, 1).size());

        // 用 1 - 10 初始化 set
        initSset1();

        // 随机获取1个元素, 不传count
        String srandmember = jedis.srandmember(skey1);
        assertNotNull(srandmember);
        assertEquals(Long.valueOf(10), jedis.scard(skey1)); // 集合数量不变

        // 随机获取多个元素, 传count
        List<String> srandmembers = jedis.srandmember(skey1, 4);
        assertEquals(4, srandmembers.size());

        // 如果 count > set size, 返回整个集合
        srandmembers = jedis.srandmember(skey1, 20);
        assertEquals(10, srandmembers.size());

        // 如果 count < 0, 返回绝对值个元素
        srandmembers = jedis.srandmember(skey1, -2);
        assertEquals(2, srandmembers.size());

        // 如果 count < 0, 且绝对值 > set size, 返回 count 绝对值个元素, 元素会出现重复
        srandmembers = jedis.srandmember(skey1, -20);
        assertEquals(20, srandmembers.size());

        // if key 不是 set 类型, 报错
        jedis.set(key1, "v1");

        try {
            jedis.srandmember(key1);
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    @Test
    public void srem() {
        delIfExists(skey1);

        // key 不存在, 什么也不做, 影响行数为 0
        Long srem = jedis.srem(skey1, "1");
        assertEquals(ZERO, srem);

        // 1 - 10 初始化一个set
        initSset1();

        // 删除集合中指定元素
        srem = jedis.srem(skey1, "1", "2");
        assertEquals(Long.valueOf(2), srem);
        assertEquals(Long.valueOf(8), jedis.scard(skey1));//还剩下8个元素

        // member 不存在, 什么也不做, 返回 0
        srem = jedis.srem(skey1, "1");
        assertEquals(ZERO, srem);

        // member 重复, 忽略
        srem = jedis.srem(skey1, "3", "3");
        assertEquals(ONE, srem);
        assertEquals(Long.valueOf(7), jedis.scard(skey1));

        // key 不是 set 类型, 报错
        jedis.set(key1, "v1");
        try {
            jedis.srem(key1, "1");
        } catch (Exception e) {
            logger.error("key 不是 set 类型, 报错: ", e);
        }
    }

    private void initSset1() {
        delIfExists(skey1);

        for (int i = 1; i <= 10; i++) {
            jedis.sadd(skey1, String.valueOf(i));
        }
    }

    private void delIfExists(String key) {
        if (jedis.exists(key)) {
            jedis.del(key);
        }
    }
}
Copyright © wychuan.com 2017 all right reserved,powered by Gitbook该文件修订时间: 2017-10-17 02:48:52

results matching ""

    No results matching ""