1. 程式人生 > >SpringBoot 整合Jedis操作set

SpringBoot 整合Jedis操作set

題外話:

Redis是個有趣的東西,相信搞java的或多或少都會用到,面試時也總離不開問Redis,之前覺得redis只是用做快取,飛快!也因為最初在封裝底層的時候,使用Redisson,所以大部分都只用到了String這種型別,不管相應的value是List還是Map,最多也就以json格式儲存,慢慢的用多了,才發現在業務中錯過了許多優化的地方;

其中Set型別是一個不錯的選擇,舉個例子,我們實際業務中存在粉絲訂閱關係,同時,因為採用Spring Cloud分散式架構,加上各個微服務之間做了分庫,導致許多地方在查詢時需要feign呼叫訂閱關係去做其他邏輯,用Set儲存可以解決粉絲關注,粉絲數統計,我關注的人也關注了誰等等問題;

1、pom.xml

<!-- jedis -->
<dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.8.2</version>
</dependency>

  

2、注入bean

 1 @Bean
 2 public JedisPool redisPoolFactory(
 3 @Value("${spring.redis.host}") String redisHost,
 4 @Value("${spring.redis.port}") int redisPort,
 5 @Value("${spring.redis.password}") String redisPassword,
 6 @Value("${spring.redis.database}") int database ,
 7 @Value("${spring.redis.jedis.pool.max-wait}") int maxWaitMillis,
 8 @Value("${spring.redis.jedis.pool.max-idle}") int maxIdle,
 9 @Value("${spring.redis.jedis.pool.max-active}") int maxActive
10         ){
11         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
12         jedisPoolConfig.setMaxIdle(maxIdle);
13         jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
14         jedisPoolConfig.setMaxTotal(maxActive);
15         jedisPoolConfig.setMinIdle(0);
16         jedisPoolConfig.setMaxIdle(maxIdle);
17         JedisPool jedisPool = new JedisPool(jedisPoolConfig,redisHost,redisPort,0,redisPassword);
18         return jedisPool;
19         }
20 @Bean
21 public JedisUtils jedisUtils (JedisPool jedisPool ){
22         return new JedisUtils(jedisPool);
23         }

 

3、JedisUtils操作set

package com.cookie.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.Set;
/**
 * author : cxq
 * Date : 2019/7/11
 */
//@Component
public class JedisUtils {
    private final static Logger logger = LoggerFactory.getLogger(JedisUtils.class);
    // @Autowired
    private JedisPool jedisPool ;
    public JedisUtils(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }
    /**
     * 查詢set集合資料
     * @param key
     * @return
     */
    public Set<String> getSet(String key ){
        Jedis jedis = null ;
        Set<String> set = null ;
        try {
            jedis = jedisPool.getResource();
            set = jedis.smembers(key);
        }catch (Exception e ){
            logger.error(" get set error : "+e.getMessage());
        }
        return set ;
    }
    /**
     * 往set中新增資料
     * @param key
     * @param values
     * @return
     */
    public Long addSet(String key , String... values ){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.sadd(key,values);
        }catch (Exception e ){
            logger.error(" get set error : "+e.getMessage());
        }
        return 0L ;
    }
    /**
     * 刪除資料
     * @param key
     * @param values
     * @return
     */
    public Long delSet(String key , String... values ){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.srem(key,values);
        }catch (Exception e ){
            logger.error(" del set error : "+e.getMessage());
        }
        return 0L ;
    }
    /**
     * 求第一個key與其他key不同的部分
     * @param keys
     * @return
     */
    public Set<String> getDiffSet(String... keys){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.sdiff(keys);
        }catch (Exception e ){
            logger.error(" get diff set error : "+e.getMessage());
        }
        return null ;
    }
    /**
     * 求key的合集
     * @param keys
     * @return
     */
    public Set<String> getUnionSet(String... keys){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.sunion(keys);
        }catch (Exception e ){
            logger.error(" get union set error : "+e.getMessage());
        }
        return null ;
    }
    /**
     * 求key的交集
     * @param keys
     * @return
     */
    public Set<String> getInterSet(String... keys){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.sinter(keys);
        }catch (Exception e ){
            logger.error(" get inter set error : "+e.getMessage());
        }
        return null ;
    }
    /**
     * 獲取key的長度
     * @param key
     * @return
     */
    public Long getSetCount(String key ){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.scard(key);
        }catch (Exception e ){
            logger.error(" get set count error : "+e.getMessage());
        }
        return 0L ;
    }
    /**
     * 判斷值是否存在
     * @param key
     * @param value
     * @return
     */
    public boolean checkValueIsInSet(String key , String value ){
        Jedis jedis = null ;
        try {
            jedis = jedisPool.getResource();
            return jedis.sismember(key,value);
        }catch (Exception e ){
            logger.error(" check member is in set error : "+e.getMessage());
        }
        return false ;
    }
}