RedisTemplateSet数据类型的常用操作

Posted 好好生活_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RedisTemplateSet数据类型的常用操作相关的知识,希望对你有一定的参考价值。

引言

上篇博客总结了使用RedisTemplate操作ZSet数据类型的一些常用方法,本篇博客继续总结Set数据类型。

Set数据结构

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

常用方法

1. 增加集合元素

/**
 * set中增加元素,支持一次增加多个元素,逗号分隔即可,结果返回添加的个数
 *
 * @param key
 * @param value
 * @return
 */
public Long addSet(String key, Object... value) 
    Long size = null;
    try 
        size = redisTemplate.opsForSet().add(key, value);
     catch (Exception e) 
        log.error("[RedisUtils.addSet] [error]", e);
        return size;
    
    return size;

示例代码
@Test
public void addSet() 
    System.out.println(redisUtils.addSet("word-book", "article", "boy", "cat", "dog", "English"));
    System.out.println(redisUtils.addSet("chinese-word", "年", "月", "日"));

2. 移除指定元素

/**
 * set中移除指定元素
 *
 * @param key
 * @param value
 * @return
 */
public Long removeSet(String key, Object value) 
    Long size = null;
    try 
        size = redisTemplate.opsForSet().remove(key, value);
     catch (Exception e) 
        log.error("[RedisUtils.removeSet] [error]", e);
        return size;
    
    return size;

示例代码
@Test
public void removeSet() 
    //key和value能查询到,返回1;存在对应的key,value不存在,返回0
    System.out.println(redisUtils.removeSet("word-book", "cat"));
    //key不存在,异常,返回null
    System.out.println(redisUtils.removeSet("111", "cat"));

3. 计算集合大小

/**
 * 计算set集合大小
 *
 * @param key
 * @return
 */
public Long countSet(String key) 
    Long size = null;
    try 
        size = redisTemplate.opsForSet().size(key);
     catch (Exception e) 
        log.error("[RedisUtils.countSet] [error]", e);
    
    return size;

示例代码
@Test
public void countSet() 
    //key存在,返回个数
    System.out.println(redisUtils.countSet("word-book"));
    //key不存在,异常
    System.out.println(redisUtils.countSet("111"));

4. 判断集合中是否存在某元素

/**
 * 判断set中是否存在某元素
 *
 * @param key
 * @param value
 * @return
 */
public Boolean hasMemberSet(String key, Object value) 
    Boolean exist = false;
    try 
        exist = redisTemplate.opsForSet().isMember(key, value);
     catch (Exception e) 
        log.error("[RedisUtils.hasNumberSet] [error]", e);
    
    return exist;

示例代码
@Test
public void hasMemberSet() 
    //key和value存在,返回true
    System.out.println(redisUtils.hasMemberSet("word-book", "boy"));
    //key存在,value不存在,返回false
    System.out.println(redisUtils.hasMemberSet("word-book", "111"));
    //key不存在,异常
    System.out.println(redisUtils.hasMemberSet("111", "111"));

5. 随机获取集合中的一个元素

/**
 * 随机获取set中的一个元素
 *
 * @param key
 * @return
 */
public Object randomMember(String key) 
    Object o = null;
    try 
        o = redisTemplate.opsForSet().randomMember(key);
     catch (Exception e) 
        log.error("[RedisUtils.randomMember] [error]", e);
    
    return o;

示例代码
@Test
public void randomMember() 
    //key存在,返回元素
    System.out.println(redisUtils.randomMember("word-book"));
    //key不存在,异常
    System.out.println(redisUtils.randomMember("111"));

6. 随机获取集合中的元素(指定个数,可能重复)

/**
 * 随机获取指定个数的元素(可能重复)
 *
 * @param key
 * @param num
 * @return
 */
public List<Object> randomMembers(String key, Integer num) 
    List<Object> o = null;
    try 
        o = redisTemplate.opsForSet().randomMembers(key, num);
     catch (Exception e) 
        log.error("[RedisUtils.randomMember] [error]", e);
    
    return o;

示例代码
@Test
public void randomNumMember() 
    //key存在,随机返回5个,可能重复
    System.out.println(redisUtils.randomMembers("word-book", 5));

7. 随机获取集合中的元素(指定个数,不重复)

/**
 * 随机获取集合内指定个数的元素(不重复)
 *
 * @param key
 * @param num
 * @return
 */
public Set<Object> distinctRandomMembers(String key, Integer num) 
    Set<Object> o = null;
    try 
        o = redisTemplate.opsForSet().distinctRandomMembers(key, num);
     catch (Exception e) 
        log.error("[RedisUtils.randomMember] [error]", e);
    
    return o;

示例代码
@Test
public void distinctRandomNumMember() 
    //key存在,返回不重复的5个元素
    System.out.println(redisUtils.distinctRandomMembers("word-book", 5));

8. 随机移除一个元素

/**
 * 随机移除一个元素
 *
 * @param key
 * @return
 */
public Object popMember(String key) 
    Object o = null;
    try 
        o = redisTemplate.opsForSet().pop(key);
     catch (Exception e) 
        log.error("[RedisUtils.popMember] [error]", e);
    
    return o;

示例代码
@Test
public void popMember() 
    //key存在,返回删除的元素
    System.out.println(redisUtils.popMember("word-book"));

9. 获取集合内的所有元素

/**
 * 获取key下的所有元素
 *
 * @param key
 * @return
 */
public Set<Object> members(String key) 
    Set<Object> result = null;
    try 
        result = redisTemplate.opsForSet().members(key);
     catch (Exception e) 
        log.error("[RedisUtils.members] [error]", e);
    
    return result;

示例代码
@Test
public void members() 
    System.out.println(redisUtils.members("chinese-word"));

10. 移动元素

/**
 * 将key1集合中的元素value移到key2集合中
 *
 * @param key1
 * @param value
 * @param key2
 * @return
 */
public Boolean moveMember(String key1, Object value, String key2) 
    Boolean result = false;
    try 
        result = redisTemplate.opsForSet().move(key1, value, key2);
     catch (Exception e) 
        log.error("[RedisUtils.moveMember] [error]", e);
    
    return result;

示例代码
@Test
public void moveMember() 
    System.out.println(redisUtils.moveMember("word-book", "article", "chinese-word"));
    System.out.println(redisUtils.members("word-book"));
    System.out.println(redisUtils.members("chinese-word"));

11. 两个集合取交集(两个key之间)

/**
 * 两个key之间取交集
 *
 * @param key
 * @param key2
 * @return
 */
public Set<Object> intersectMember(String key, String key2) 
    Set<Object> result = null;
    try 
        result = redisTemplate.opsForSet().intersect(key, key2);
     catch (Exception e) 
        log.error("[RedisUtils.intersectMember] [error]", e);
    
    return result;

示例代码
@Test
public void intersectMember() 
    System.out.println(redisUtils.addSet("set-one", "one", "two", "three", "four", "five"));
    System.out.println(redisUtils.addSet("set-two", "one", "three", "ten", "nine"));
    System.out.println(redisUtils.intersectMember("set-one", "set-two"));

12. 集合取交集(一个key与多个key之间)

/**
 * 一个集合与多个集合之间取交集
 *
 * @param key
 * @param key2
 * @return
 */
public Set<Object> multiIntersectMember(String key, Set<String> key2) 
    Set<Object> result = null;
    try 
        result = redisTemplate.opsForSet().intersect(key, key2);
     catch (Exception e) 
        log.error("[RedisUtils.multiIntersectMember] [error]", e);
    
    return result;

示例代码
@Test
public void multiIntersectMember() 
    System.out.println(redisUtils.addSet("set-three", "three", "eight", "seven"));
    Set<String> set = new HashSet<>();
    set.add("set-three");
    set.add("set-two");
    System.out.println(redisUtils.multiIntersectMember("set-one", set));

13. 集合取交集,并放入指定集合

/**
 * 取交集并放入key3集合
 *
 * @param key1
 * @param key2
 * @param key3
 */
public Long storeIntersectMember(String key1, String key2, String key3) 
    Long result = null;
    try 
        result = redisTemplate.opsForSet().intersectAndStore(key1, key2, key3);
     catch (Exception e) 
        log.error("[RedisUtils.storeIntersectMember] [error]", e);
    
    return result;

示例代码
@Test
public void storeIntersectMember() 
    System.out.println(redisUtils.intersectMember("set-one", "set-two"));
    System.out.println(redisUtils.members("set-four"));
    System.out.println(redisUtils.storeIntersectMember("set-one", "set-two", "set-four"));
    System.out.println(redisUtils.members("set-four"));

14. 集合取并集(两个集合之间)

/**
 * 求并集
 *
 * @param key1
 * @param key2
 * @return
 */
public Set<Object> unionMember(String key1, String key2) 
    Set<Object> objects = null;
    try 
        objects = redisTemplate.opsForSet().union(key1, key2);
     catch (Exception e) 
        log.error("[RedisUtils.unionMember] [error]", e);
    
    return objects;

示例代码
@Test
public void unionMember() 
    System.out.println(redisUtils.unionMember("set-one", "set-two"));

15. 集合取并集(一个集合与多个集合之间)

/**
 * 求并集(一个集合与多个集合之间)
 *
 * @param key1
 * @param keys
 * @return
 */
public Set<Object> multiUnionMember(String key1, Set<String> keys) 
    Set<Object> objects = null;
    try 
        objects = redisTemplate.opsForSet().union(key1, keys);
     catch (Exception e) 
        log.error("[RedisUtils.multiUnionMember] [error]", e);
    
    return objects;

示例代码
@Test
public void multiUnionMember() 
    Set<String> set = new HashSet<>();
    set.add("set-three");
    set.add("set-two");
    System.out.println(redisUtils.multiUnionMember("set-one", set));

以上是关于RedisTemplateSet数据类型的常用操作的主要内容,如果未能解决你的问题,请参考以下文章

深入了解Redis操作五大数据类型常用命令

解析Redis操作五大数据类型常用命令

python的数据类型+常用操作符

python的数据类型+常用操作符

Redis五大数据类型的常用操作

解析Redis操作五大数据类型常用命令