1 package com.hzlg.ui.util; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Component; 7 8 import redis.clients.jedis.Jedis; 9 import redis.clients.jedis.JedisPool; 10 @Component 11 public class RedisUtil { 12 13 /** 14 * redis 鏈接池,這裏jedisPool咱們再以前spring配置中配置好了,交給spring管理,這裏能夠自動注入 15 */ 16 @Autowired 17 private JedisPool jedisPool; 18 19 public void setPool(JedisPool jedisPool) { 20 this.jedisPool = jedisPool; 21 } 22 /** 23 * 獲取jedis 24 * @return 25 */ 26 public Jedis getResource(){ 27 Jedis jedis =null; 28 try { 29 jedis =jedisPool.getResource(); 30 } catch (Exception e) { 31 CommonUtils.logger.info(e); 32 CommonUtils.logger.info("can't get the redis resource"); 33 } 34 return jedis; 35 } 36 /** 37 * 關閉鏈接 38 * @param jedis 39 */ 40 public void disconnect(Jedis jedis){ 41 jedis.disconnect(); 42 } 43 /** 44 * 將jedis 返還鏈接池 45 * @param jedis 46 */ 47 public void returnResource(Jedis jedis){ 48 if(null != jedis){ 49 try { 50 jedisPool.returnResource(jedis); 51 } catch (Exception e) { 52 CommonUtils.logger.info(e); 53 CommonUtils.logger.info("can't return jedis to jedisPool"); 54 } 55 } 56 } 57 /** 58 * 沒法返還jedispool,釋放jedis客戶端對象, 59 * @param jedis 60 */ 61 public void brokenResource(Jedis jedis){ 62 if (jedis!=null) { 63 try { 64 jedisPool.returnBrokenResource(jedis); 65 } catch (Exception e) { 66 CommonUtils.logger.info(e); 67 CommonUtils.logger.info("can't release jedis Object"); 68 } 69 } 70 } 71 }
package com.hzlg.ui.service; import java.util.Map; public interface RedisCacheStorageService<K,V> { /** * 在redis數據庫中插入 key 和value * @param key * @param value * @return */ boolean set(K key,V value); /** * 在redis數據庫中插入 key 和value 而且設置過時時間 * @param key * @param value * @param exp 過時時間 * @return */ boolean set(K key, V value, int exp); /** * 根據key 去redis 中獲取value * @param key * @return */ V get(K key,Object object); /** * 刪除redis庫中的數據 * @param key * @return */ boolean remove(K key); /** * 設置哈希類型數據到redis 數據庫 * @param cacheKey 能夠看作一張表 * @param key 表字段 * @param value * @return */ boolean hset(String cacheKey,K key,V value); /** * 獲取哈希表數據類型的值 * @param cacheKey * @param key * @return */ V hget(String cacheKey,K key,Object object); /** * 獲取哈希類型的數據 * @param cacheKey * @return */ Map<K,V> hget(String cacheKey,Object object); /** * 該條記錄在redis中是否存在 * **/ boolean exists(String sessionid); }
package com.hzlg.ui.service.impl; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisException; import com.hzlg.ui.entity.UserInfo; import com.hzlg.ui.service.RedisCacheStorageService; import com.hzlg.ui.util.CommonUtils; import com.hzlg.ui.util.RedisUtil; @Service("redisCacheStorageServiceImpl") public class RedisCacheStorageServiceImpl<V> implements RedisCacheStorageService<String,V>{ /** * 默認過期時間 */ private static final int EXPRIE_TIME =3600*24; /** * 獲取Jedis相關操做 */ @Autowired private RedisUtil redisUtil; @Override public boolean set(String key, V value) { return set(key,value,EXPRIE_TIME); } @Override public boolean set(String key, V value, int exp) { Jedis jedis=null; if(StringUtils.isEmpty(key)){ return false; } try { //獲取jedis對象 jedis= redisUtil.getResource(); //使用對象轉換爲Json格式插入redis JSONObject json = JSONObject.fromObject(value);//將java對象轉換爲json對象 String jsonValue = json.toString();//將json對象轉換爲json字符串 jedis.setex(key,exp,jsonValue); }catch (Exception e){ CommonUtils.logger.info(e); //釋放jedis對象 redisUtil.brokenResource(jedis); CommonUtils.logger.info("client can't connect server"); return false; }finally { redisUtil.returnResource(jedis);//返還鏈接池 return true; } } @Override public V get(String key,Object object) { Jedis jedis=null; V v=null; if(StringUtils.isEmpty(key)){ CommonUtils.logger.info("redis取值,key爲空"); return null; } try{ jedis=redisUtil.getResource(); //獲取鏈接 String jsonValue=jedis.get(key); //從redis獲得值,獲得的是json字符串,由於咱們以前插入的時候是使用的json字符串 if(StringUtils.isEmpty(jsonValue)){ return null; } JSONObject obj = new JSONObject().fromObject(jsonValue);//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲你想要的java對象 return v; }catch (Exception e){ CommonUtils.logger.info(e); //釋放jedis對象 if(jedis!=null){ redisUtil.brokenResource(jedis); } CommonUtils.logger.info("client can't get value"); return null; }finally { //返還鏈接池 redisUtil.returnResource(jedis); } } @Override public boolean remove(String key) { Jedis jedis=null; try{ jedis=redisUtil.getResource(); if(StringUtils.isEmpty(key)){ CommonUtils.logger.info("redis取值,key爲空"); return false; } jedis.del(key); }catch (Exception e) { CommonUtils.logger.info(e); //釋放jedis對象 if(jedis!=null){ redisUtil.brokenResource(jedis); } CommonUtils.logger.info(" del fail from redis"); return false; }finally{ //返還鏈接池 redisUtil.returnResource(jedis); return true; } } @Override public boolean hset(String cacheKey, String key, V value) { Jedis jedis =null; //將key 和value 轉換成 json 對象 JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲json字符串 JSONObject json2 = JSONObject.fromObject(value);//將java對象轉換爲json對象 String jsonValue = json2.toString();//將json對象轉換爲json字符串 //操做是否成功 boolean isSucess =true; if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty"); return false; } try { jedis =redisUtil.getResource(); //執行插入哈希 jedis.hset(jCacheKey, key, jsonValue); } catch (Exception e) { CommonUtils.logger.info("client can't connect server"); isSucess =false; if(null !=jedis){ //釋放jedis 對象 redisUtil.brokenResource(jedis); } return false; }finally{ if (isSucess) { //返還鏈接池 redisUtil.returnResource(jedis); } return true; } } @Override public V hget(String cacheKey, String key,Object object) { Jedis jedis =null; V v =null; JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲json字符串 if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty"); return null; } try { //獲取客戶端對象 jedis =redisUtil.getResource(); //執行查詢 String jsonValue = jedis.hget(jCacheKey, key); //判斷值是否非空 if(StringUtils.isEmpty(jsonValue)){ return null; }else{ JSONObject obj = new JSONObject().fromObject(jsonValue);//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲java對象 } //返還鏈接池 redisUtil.returnResource(jedis); } catch (JedisException e) { CommonUtils.logger.info("client can't connect server"); if(null !=jedis){ //redisUtil 對象 redisUtil.brokenResource(jedis); } } return v; } @Override public Map<String, V> hget(String cacheKey,Object object) { JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲字符串 //非空校驗 if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty!"); return null; } Jedis jedis =null; Map<String,V> result =null; V v=null; try { jedis =redisUtil.getResource(); //獲取列表集合 由於插入redis的時候是jsonString格式,因此取出來key是String value也是String Map<String,String> map = jedis.hgetAll(jCacheKey); if(null !=map){ for(Map.Entry<String, String> entry : map.entrySet()){ if(result ==null){ result =new HashMap<String,V>(); } JSONObject obj = new JSONObject().fromObject(entry.getValue());//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲java對象 result.put(entry.getKey(), v); } } } catch (JedisException e) { CommonUtils.logger.info("client can't connect server"); if(null !=jedis){ //釋放jedis 對象 redisUtil.brokenResource(jedis); } } return result; } @Override public boolean exists(String sessionid) { UserInfo userInfo=(UserInfo) get(sessionid,new UserInfo()); if(userInfo!=null){ return true; } return false; } }
package com.hzlg.ui.service.impl; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisException; import com.hzlg.ui.entity.UserInfo; import com.hzlg.ui.service.RedisCacheStorageService; import com.hzlg.ui.util.CommonUtils; import com.hzlg.ui.util.RedisUtil; @Service("redisCacheStorageServiceImpl") public class RedisCacheStorageServiceImpl<V> implements RedisCacheStorageService<String,V>{ /** * 默認過期時間 */ private static final int EXPRIE_TIME =3600*24; /** * 獲取Jedis相關操做 */ @Autowired private RedisUtil redisUtil; @Override public boolean set(String key, V value) { return set(key,value,EXPRIE_TIME); } @Override public boolean set(String key, V value, int exp) { Jedis jedis=null; if(StringUtils.isEmpty(key)){ return false; } try { //獲取jedis對象 jedis= redisUtil.getResource(); //使用對象轉換爲Json格式插入redis JSONObject json = JSONObject.fromObject(value);//將java對象轉換爲json對象 String jsonValue = json.toString();//將json對象轉換爲json字符串 jedis.setex(key,exp,jsonValue); }catch (Exception e){ CommonUtils.logger.info(e); //釋放jedis對象 redisUtil.brokenResource(jedis); CommonUtils.logger.info("client can't connect server"); return false; }finally { redisUtil.returnResource(jedis);//返還鏈接池 return true; } } @Override public V get(String key,Object object) { Jedis jedis=null; V v=null; if(StringUtils.isEmpty(key)){ CommonUtils.logger.info("redis取值,key爲空"); return null; } try{ jedis=redisUtil.getResource(); //獲取鏈接 String jsonValue=jedis.get(key); //從redis獲得值,獲得的是json字符串,由於咱們以前插入的時候是使用的json字符串 if(StringUtils.isEmpty(jsonValue)){ return null; } JSONObject obj = new JSONObject().fromObject(jsonValue);//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲你想要的java對象 return v; }catch (Exception e){ CommonUtils.logger.info(e); //釋放jedis對象 if(jedis!=null){ redisUtil.brokenResource(jedis); } CommonUtils.logger.info("client can't get value"); return null; }finally { //返還鏈接池 redisUtil.returnResource(jedis); } } @Override public boolean remove(String key) { Jedis jedis=null; try{ jedis=redisUtil.getResource(); if(StringUtils.isEmpty(key)){ CommonUtils.logger.info("redis取值,key爲空"); return false; } jedis.del(key); }catch (Exception e) { CommonUtils.logger.info(e); //釋放jedis對象 if(jedis!=null){ redisUtil.brokenResource(jedis); } CommonUtils.logger.info(" del fail from redis"); return false; }finally{ //返還鏈接池 redisUtil.returnResource(jedis); return true; } } @Override public boolean hset(String cacheKey, String key, V value) { Jedis jedis =null; //將key 和value 轉換成 json 對象 JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲json字符串 JSONObject json2 = JSONObject.fromObject(value);//將java對象轉換爲json對象 String jsonValue = json2.toString();//將json對象轉換爲json字符串 //操做是否成功 boolean isSucess =true; if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty"); return false; } try { jedis =redisUtil.getResource(); //執行插入哈希 jedis.hset(jCacheKey, key, jsonValue); } catch (Exception e) { CommonUtils.logger.info("client can't connect server"); isSucess =false; if(null !=jedis){ //釋放jedis 對象 redisUtil.brokenResource(jedis); } return false; }finally{ if (isSucess) { //返還鏈接池 redisUtil.returnResource(jedis); } return true; } } @Override public V hget(String cacheKey, String key,Object object) { Jedis jedis =null; V v =null; JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲json字符串 if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty"); return null; } try { //獲取客戶端對象 jedis =redisUtil.getResource(); //執行查詢 String jsonValue = jedis.hget(jCacheKey, key); //判斷值是否非空 if(StringUtils.isEmpty(jsonValue)){ return null; }else{ JSONObject obj = new JSONObject().fromObject(jsonValue);//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲java對象 } //返還鏈接池 redisUtil.returnResource(jedis); } catch (JedisException e) { CommonUtils.logger.info("client can't connect server"); if(null !=jedis){ //redisUtil 對象 redisUtil.brokenResource(jedis); } } return v; } @Override public Map<String, V> hget(String cacheKey,Object object) { JSONObject json = JSONObject.fromObject(cacheKey);//將java對象轉換爲json對象 String jCacheKey = json.toString();//將json對象轉換爲字符串 //非空校驗 if(StringUtils.isEmpty(jCacheKey)){ CommonUtils.logger.info("cacheKey is empty!"); return null; } Jedis jedis =null; Map<String,V> result =null; V v=null; try { jedis =redisUtil.getResource(); //獲取列表集合 由於插入redis的時候是jsonString格式,因此取出來key是String value也是String Map<String,String> map = jedis.hgetAll(jCacheKey); if(null !=map){ for(Map.Entry<String, String> entry : map.entrySet()){ if(result ==null){ result =new HashMap<String,V>(); } JSONObject obj = new JSONObject().fromObject(entry.getValue());//將json字符串轉換爲json對象 v = (V)JSONObject.toBean(obj,object.getClass());//將建json對象轉換爲java對象 result.put(entry.getKey(), v); } } } catch (JedisException e) { CommonUtils.logger.info("client can't connect server"); if(null !=jedis){ //釋放jedis 對象 redisUtil.brokenResource(jedis); } } return result; } @Override public boolean exists(String sessionid) { UserInfo userInfo=(UserInfo) get(sessionid,new UserInfo()); if(userInfo!=null){ return true; } return false; } }
applicationContext.xml配置java
<context:property-placeholder location="classpath*:/application.properties" ignore-resource-not-found="true" ignore-unresolvable="true" /> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="500"/><!-- 最大鏈接數 --> <property name="maxIdle" value="100"/><!-- 最大閒置 --> <property name="minIdle" value="10"/><!-- 最小閒置 --> <property name="maxWaitMillis" value="5000"/><!-- 最大等待 --> <property name="testOnBorrow" value="true"/><!-- 能夠獲取 --> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg index="0" ref="jedisPoolConfig"/> <constructor-arg index="2" value="6379"/><!-- 端口 --> <constructor-arg index="3" value="5000"/><!-- 超時 --> <constructor-arg index="1" value="127.0.0.1"/><!-- Redis IP地址 --> <constructor-arg index="4" value="123456"/><!-- 密碼 --> </bean>
application.propertiesredis
#-------Redis--------
redis.pool.maxTotal=1000
redis.pool.maxIdle=200
redis.pool.maxWaitMillis=2000
redis.pool.testOnBorrow=true
redis.host=127.0.0.1
redis.password=123456
redis.port=6379spring
所需jar包數據庫
commons-pool2-2.4.2-javadoc.jar,commons-pool2-2.4.2.jar,jedis-2.7.2.jar,spring-data-redis-2.0.9.RELEASE.jar,spring-session-1.2.1.RELEASE.jarjson