redis命令使用-jedis调用(Redis 集合Set)

  |   0 评论   |   0 浏览
package com.songaw.redistest;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

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

/**
 * @author songanwei
 * @description Redis 集合(Set)
 * Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
 * 集合对象的编码可以是 intset 或者 hashtable。
 * Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
 * 集合中最大的成员数为 2的32次方 - 1 (4294967295, 每个集合可存储40多亿个成员)。
 * @date 2022/3/18
 */
public class JedisSetTest {
    public static void main(String[] args) {
        test1();
    }

    /**
     * 连接测试
     */
    private static void test1() {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接服务成功");
        //查看服务是否运行
        System.out.println("服务正在运行: " + jedis.ping());
        String testKey = "test_set_key";

        jedis.del(testKey);
        jedis.del(testKey+"1");
        //sadd 向集合添加一个或多个成员
        for (int i = 0; i < 10; i++) {
            jedis.sadd(testKey, "test" + i);
        }
        //smembers 返回集合中的所有成员
        Set<String> members= jedis.smembers(testKey);
        System.out.println("smembers "+members);

        //scard 获取集合的成员数
        Long resultV=jedis.scard(testKey);
        System.out.println("scard "+resultV);

        //sdiff 返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。
        //差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1..OTHER_KEYN 的差集。
        for (int i = 5; i < 15; i++) {
            jedis.sadd(testKey+"1", "test" + i);
        }

        members=jedis.sdiff(testKey+"1",testKey);
        System.out.println("sdiff "+members);

        //sdiffstore 将给定集合之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。

        resultV=jedis.sdiffstore(testKey+"3",testKey+"1",testKey);
        System.out.println("sdiffstore resultV "+resultV+", smembers "+jedis.smembers(testKey+"3"));

        //sinter 返回给定所有集合的交集
        members=jedis.sinter(testKey,testKey+"1");
        System.out.println("members "+members);

        //sinterstore 返回给定所有集合的交集并存储在 destination 中
        resultV=jedis.sinterstore(testKey+"3",testKey+"1",testKey);
        System.out.println("sinterstore resultV "+resultV+", smembers "+jedis.smembers(testKey+"3"));

        //sunion 返回所有给定集合的并集
        members=jedis.sunion(testKey,testKey+"1");
        System.out.println("sunion "+members);

        //sunionstore 所有给定集合的并集存储在 destination 集合中
        resultV=jedis.sunionstore(testKey+"3",testKey,testKey+"1");
        System.out.println("sunionstore resultV "+resultV+", smembers "+jedis.smembers(testKey+"3"));

        //sismember 判断 member 元素是否是集合 key 的成员
        boolean resultB =jedis.sismember(testKey,"test1");
        System.out.println("sismember resultB:"+resultB);

        //smove 将 member 元素从 source 集合移动到 destination 集合
        //SMOVE 是原子性操作。如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。
        //否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
        //当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
        //当 source 或 destination 不是集合类型时,返回一个错误。
        resultV=jedis.smove(testKey,testKey+"1","test1");
        System.out.println("sinterstore resultV "+resultV+", smembers "+jedis.smembers(testKey+"1"));

        //spop 移除并返回集合中的一个随机元素
        String result=jedis.spop(testKey);
        System.out.println("spop result "+result);

        //srandmember 返回集合中一个或多个随机数
        // 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
        // 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
        //该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。
        List<String> resultList=jedis.srandmember(testKey, Math.toIntExact(jedis.scard(testKey)));
        System.out.println("srandmember resultList"+resultList);

        //srem 移除集合中一个或多个成员
        resultV=jedis.srem(testKey,"test2","test3");
        System.out.println("srem resultV "+resultV+", smembers "+jedis.smembers(testKey));

        //sscan 迭代集合中的元素
        ScanParams scanParams=new ScanParams();
        scanParams.count(5);
        scanParams.match("tes*");
        List<String> keyList=new ArrayList<>();
        String cursor="0";
        ScanResult<String> stringScanResult=jedis.sscan(testKey,cursor,scanParams);
        keyList.addAll(stringScanResult.getResult());
        while (!cursor.equals(stringScanResult.getStringCursor())){
            String tempCursor=stringScanResult.getStringCursor();
            stringScanResult=jedis.sscan(testKey,tempCursor,scanParams);
            keyList.addAll(stringScanResult.getResult());
        }

        System.out.println("sscan "+keyList);





    }
}


标题:redis命令使用-jedis调用(Redis 集合Set)
作者:不断努力的青春
地址:http://songaw.com/articles/2022/03/18/1647593012995.html