Jedis中Set集合

Set集合:sXXX方法涉及到离散数学中提到的 集合的交、并、差等操作以及删除 显示等基本操作,举例应用两个用户的共同好友、共同关注就是两个集合的交;再如微博上的点赞操作也可以理解为集合操作,如果点赞就用户就存在集合中通过sismember操作返回true,此时显示点亮图标,如果返回FALSE证明没在集合中没点赞。


	
		/*
		 * 集合Set,比如共同好友 共同关注之类的可以应用
		 * 交并差 和离散数学里提到的相关操作类似
		 * 
		 */
		
		String likeKeys1="newsLike1";
		String likeKeys2="newsLike2";
		
		for(int i=0;i<10;i++){
			jedis.sadd(likeKeys1, String.valueOf(i));
			jedis.sadd(likeKeys2, String.valueOf(i*2));
		}
		print(20,jedis.smembers(likeKeys1));
		print(21,jedis.smembers(likeKeys2));
		print(22,jedis.sinter(likeKeys1,likeKeys2));//交
		print(23,jedis.sdiff(likeKeys1,likeKeys2));//差
		print(24,jedis.sunion(likeKeys1,likeKeys2));//并
		print(25,jedis.sismember(likeKeys1,"5"));//已经点过赞 页面显示加亮概念
		jedis.srem(likeKeys1, "5");//删除
		print(26,jedis.smembers(likeKeys1));
		print(27,jedis.scard(likeKeys1));//集合中有多少个元素
		jedis.smove(likeKeys2, likeKeys1, "14");//一个集合中元素移到另一个集合
		print(28,jedis.scard(likeKeys1));
		print(29,jedis.smembers(likeKeys1));

结果:

20, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
21, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
22, [0, 2, 4, 6, 8]
23, [1, 9, 3, 5, 7]
24, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18]
25, true
26, [0, 1, 2, 3, 4, 6, 7, 8, 9]
27, 9
28, 10
29, [0, 1, 2, 3, 4, 6, 7, 8, 9, 14]


set相关操作

/**
 * Set(集合)
 * SADD,SCARD,SDIFF,SDIFFSTORE,SINTER,SINTERSTORE,SISMEMBER,SMEMBERS,SMOVE,SPOP,SRANDMEMBER,SREM,SUNION,SUNIONSTORE,SSCAN
 */
public class SetTypeTest {
    private Jedis jedis;

    private static final String KEY = "set";

    private static final String VALUE = "layman";

    @Before
    public void setUp() {
        this.jedis = new Jedis(new JedisShardInfo("192.168.133.188", 6379));
    }

    /**
     * SADD key member [member ...]
     * 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
     * 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
     * 当 key 不是集合类型时,返回一个错误。
     */
    @Test
    public void SADD() {
        jedis.sadd(KEY, VALUE + 2, VALUE + 0, VALUE + 1);
        SMEMBERS();
    }

    /**
     * SCARD key
     * 返回集合 key 的基数(集合中元素的数量)。
     */
    @Test
    public void SCARD() {
        System.out.println(jedis.scard(KEY));
    }

    /**
     * SDIFF key [key ...]
     * 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
     * 不存在的 key 被视为空集。
     * <p/>
     * SDIFFSTORE destination key [key ...]
     * 这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
     * 如果 destination 集合已经存在,则将其覆盖。
     * destination 可以是 key 本身。
     */
    @Test
    public void SDIFF() {
        SMEMBERS();
        jedis.sadd(KEY + 0, VALUE + 1, VALUE + 3);
        System.out.println(jedis.smembers(KEY + 0));
        System.out.println(jedis.sdiff(KEY, KEY + 0));//返回值为KEY-KEY0的值
    }

    /**
     * SINTER key [key ...]
     * 返回一个集合的全部成员,该集合是所有给定集合的交集。
     * 不存在的 key 被视为空集。
     * 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
     * <p/>
     * SINTERSTORE destination key [key ...]
     * 这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
     * 如果 destination 集合已经存在,则将其覆盖。
     * destination 可以是 key 本身。
     */
    @Test
    public void SINTER() {
        System.out.println(jedis.sinter(KEY, KEY + 0));
    }

    /**
     * SISMEMBER key member
     * 判断 member 元素是否集合 key 的成员。
     */
    @Test
    public void SISMEMBER() {
        System.out.println(jedis.sismember(KEY, VALUE + 0));
        System.out.println(jedis.sismember(KEY, VALUE + 5));
    }

    /**
     * SMEMBERS key
     * 返回集合 key 中的所有成员。
     * 不存在的 key 被视为空集合。
     */
    @Test
    public void SMEMBERS() {
        Set<String> smembers = jedis.smembers(KEY);
        System.out.println(smembers);
    }

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

    /**
     * SPOP key
     * 移除并返回集合中的一个随机元素。
     * 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
     */
    @Test
    public void SPOP() {
        SMEMBERS();
        System.out.println(jedis.spop(KEY));
        SMEMBERS();
    }

    /**
     * SRANDMEMBER key [count]
     * 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
     * 从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
     * 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
     * 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
     * 该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
     */
    @Test
    public void SRANDMEMBER() {
        System.out.println(jedis.smembers(KEY + 0));
        System.out.println(jedis.srandmember(KEY + 0, 2));
        System.out.println(jedis.srandmember(KEY + 0, -2));
    }

    /**
     * SREM key member [member ...]
     * 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
     * 当 key 不是集合类型,返回一个错误。
     */
    @Test
    public void SREM() {
        SMEMBERS();
        jedis.srem(KEY, "layman1");
        SMEMBERS();
    }

    /**
     * SUNION key [key ...]
     * 返回一个集合的全部成员,该集合是所有给定集合的并集。
     * 不存在的 key 被视为空集。
     * <p/>
     * SUNIONSTORE destination key [key ...]
     * 这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
     * 如果 destination 已经存在,则将其覆盖。
     * destination 可以是 key 本身。
     */
    @Test
    public void SUNION() {
        SMEMBERS();
        jedis.sadd(KEY + 0, "layman" + new Random().nextInt(50));
        System.out.println(jedis.sunion(KEY, KEY + 0));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值