SpringBoot 整合Jedis操作set
阿新 • • 發佈:2019-08-09
題外話:
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 ; } }