1. 程式人生 > >關於redis服務的程式碼編碼

關於redis服務的程式碼編碼

開發十年,就只剩下這套架構體系了! >>>   

IRedisToolsService

package com.paic.dmz.app.biz.redis.service;

import java.io.Serializable;

import java.util.List;
import java.util.Set;

/**
 * redis基礎服務bate版本
 * 
 */
public interface IRedisToolsService {
	/**
	 * 儲存資料, 預設7天
	 * @param key redis的key值
	 * @param t 要儲存的物件, 必須實現序列化介面
	 * @return 成功, 返回儲存的資料
	 */
	<T extends Serializable> T set(String key, T t);
	
	/**
	 * 儲存資料
	 * @param key redis的key值
	 * @param t 要儲存的物件, 必須實現序列化介面
	 * @param liveSeconds 設定存活時間 單位秒
	 * @return 成功, 返回儲存的資料
	 */
	<T extends Serializable> T set(String key, T t, long liveSeconds);
	
	/**
	 * 返回redis中的所有存在的key
	 * @return
	 */
	Set<String> keys();
	
	/**
	 * 返回隨即生成的key值
	 * @return
	 */
	String randomKey();
	
	/**
	 * 返回是否存在該key值
	 * @param key
	 * @return
	 */
	boolean exists(String key);

	/**
	 * 通過key值刪除redis中的資料
	 * @param key
	 * @return
	 */
	<T extends Serializable> T del(String key);
	
	/**
	 * 從redis根據key查詢資料
	 * @param key
	 * @return
	 */
	<T extends Serializable> T get(String key);

	/**
	 * 延長key對應的value的存活時間
	 * @param key
	 * @param liveSeconds
	 * @return 延長成功:true, 否則false
	 */
	boolean expire(String key, long liveSeconds);

	long incr(String key);

	long decr(String key);
	
	<T extends Serializable> boolean setNX(final String key, final T t);
	
	<T extends Serializable> T  getSet(final String key, final T t);
	

	/**
	 * 將一個或多個值插入到列表頭部
	 * @param key
	 * @param t
	 * @return
	 */
	<T extends Serializable> long lpush(final String key, final T t);
	/**
	 * 獲取列表指定範圍內的元素
	 * @param key
	 * @param t
	 * @return
	 */
	List lrange(final String key, final long start, final long end);
	/**
	 * 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	boolean ltrim(final String key, long start, long end);
	
	long lpop(final String key);
	
	/**
	 * 
     * @Title: batchPipelineSet
     * @Description: 批量插入資料
     * @param @param keyList  key值列表
     * @param @param dataList value列表
     * @param @param expire   過期時間
     * @return void    返回型別
     * @throws
	 */
	void batchPipelineSet(List<String> keyList,List<Object> dataList, long expire);
	
}

RedisToolsServiceImpl

package com.paic.dmz.app.biz.redis.service.impl;

import java.io.Serializable;

import java.util.List;
import java.util.Set;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.paic.dmz.app.biz.redis.dao.IRedisToolsDAO;
import com.paic.dmz.app.biz.redis.service.IRedisToolsService;

@Service("redisToolsService")
public class RedisToolsServiceImpl implements IRedisToolsService{
	
	@Resource
	private IRedisToolsDAO redisToolsDAO;

	@Override
	public <T extends Serializable> T set(String key, T t) {

		return (T)redisToolsDAO.set(key, t);
	}

	@Override
	public <T extends Serializable> T set(String key, T t, long liveSeconds) {
		
		return (T)redisToolsDAO.set(key, t, liveSeconds);
	}

	@Override
	public Set<String> keys() {

		return redisToolsDAO.keys();
	}

	@Override
	public String randomKey() {

		return redisToolsDAO.randomKey();
	}

	@Override
	public boolean exists(String key) {

		return redisToolsDAO.exists(key);
	}

	@SuppressWarnings("unchecked")
	@Override
	public <T extends Serializable> T del(String key) {

		return (T)redisToolsDAO.del(key);
	}

	@SuppressWarnings("unchecked")
	@Override
	public <T extends Serializable> T get(String key) {

		return (T)redisToolsDAO.get(key);
	}

	@Override
	public boolean expire(String key, long liveSeconds) {

		return redisToolsDAO.expire(key, liveSeconds);
	}

	@Override
	public long incr(String key) {
		return redisToolsDAO.incr(key);
	}

	@Override
	public long decr(String key) {
		return redisToolsDAO.decr(key);
	}
	
	@Override
	public <T extends Serializable> boolean setNX(final String key, final T t){
	return redisToolsDAO.setNX(key, t);	
	}
	
	@Override
	public <T extends Serializable> T  getSet(final String key, final T t){
		return redisToolsDAO.getSet(key, t);	
	}

	@Override
	public <T extends Serializable> long lpush(final String key, final T t) {
		// TODO Auto-generated method stub
		return redisToolsDAO.lpush(key, t);
	}

	@Override
	public List lrange(final String key, final long start, final long end) {
		// TODO Auto-generated method stub
		return redisToolsDAO.lrange(key, start, end);
	}

	@Override
	public boolean ltrim(final String key, final long start, final long end) {
		// TODO Auto-generated method stub
		return redisToolsDAO.ltrim(key, start, end);
	}

	@Override
	public long lpop(String key) {
		// TODO Auto-generated method stub
		return redisToolsDAO.lpop(key);
	}
	
	public void batchPipelineSet(final List<String> keyList,final  List<Object> dataList, final long expire){
		redisToolsDAO.batchPipelineSet(keyList, dataList, expire);
	}
	
}

IRedisToolsDAO

package com.paic.dmz.app.biz.redis.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

/**
 * redis整合spring, 暫時開放如下介面。如有需要在做擴充套件
 * @author EX-CHENKEFENG001
 * 
 * @version 1.0bate
 *
 */
public interface IRedisToolsDAO {

	/**
	 * 儲存資料, 預設7天
	 * @param key redis的key值
	 * @param t 要儲存的物件, 必須實現序列化介面
	 * @return 成功, 返回儲存的資料
	 */
	<T extends Serializable> T set(String key, T t);
	
	/**
	 * 儲存資料
	 * @param key redis的key值
	 * @param t 要儲存的物件, 必須實現序列化介面
	 * @param liveSeconds 設定存活時間 單位秒
	 * @return 成功, 返回儲存的資料
	 */
	<T extends Serializable> T set(String key, T t, long liveSeconds);

	/**
	 * 返回redis中的所有存在的key
	 * @return
	 */
	Set<String> keys();
	
	/**
	 * 返回隨即生成的key值
	 * @return
	 */
	String randomKey();
	
	/**
	 * 返回是否存在該key值
	 * @param key
	 * @return
	 */
	boolean exists(String key);

	/**
	 * 通過key值刪除redis中的資料
	 * @param key
	 * @return
	 */
	<T extends Serializable> T del(String key);
	
	/**
	 * 從redis根據key查詢資料
	 * @param key
	 * @return
	 */
	<T extends Serializable> T get(String key);

	/**
	 * 延長key對應的value的存活時間
	 * @param key
	 * @param liveSeconds
	 * @return 延長成功:true, 否則false
	 */
	boolean expire(String key, long liveSeconds);

	/**
	 * 增加獲取值
	 * @param key
	 * @return
	 */
	long incr(String key);

	/**
	 * 減少獲取值
	 * @param key
	 * @return
	 */
	long decr(String key);

	
	<T extends Serializable> boolean setNX(final String key, final T t);
	
	<T extends Serializable> T  getSet(final String key, final T t);
	
	/**
	 * 將一個或多個值插入到列表頭部
	 * @param key
	 * @param t
	 * @return
	 */
	<T extends Serializable> long lpush(final String key, final T t);
	/**
	 * 獲取列表指定範圍內的元素
	 * @param key
	 * @param t
	 * @return
	 */
	List lrange(final String key, final long start, final long end);
	/**
	 * 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	boolean ltrim(final String key, long start, long end);
	

	long lpop(final String key);
	
	
	/**
	 * pipeline
     * @Title: batchPipelineSet
     * @Description: 管道方式插入資料
     * @param  keyList key值列表
     * @param  dataList value值列表
     * @param  expire  過期時間
     * @return void
     * @throws
	 */
	void batchPipelineSet(final List<String> keyList,final List<Object> dataList,final  long expire);
	
}

RedisToolsDAOImpl

package com.paic.dmz.app.biz.redis.dao.impl;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Repository;

import com.paic.common.utils.Constants;
import com.paic.common.utils.FormatLogger;
import com.paic.dmz.app.biz.redis.dao.IRedisToolsDAO;
import com.paic.security.cyberarkV9.service.CyberarkV9Service;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
/**
 * Redis基礎服務
 * @author EX-CHENKEFENG001
 *
 */
@Repository("redisToolsDAO")
public class RedisToolsDAOImpl implements IRedisToolsDAO, ApplicationContextAware{
	
	protected final FormatLogger logger = new FormatLogger(this.getClass());

	private RedisTemplate<String, String> redisTemplate;

	
	@Override
	public <T extends Serializable> T set(final String key, final T t) {
		
		return (T)set(key, t, Constants.DEFAULT_CACHE_SECONDS);
	}

	@Override
	public <T extends Serializable> T set(final String key, final T t, final long liveSeconds) {
		try{
			return redisTemplate.execute(new RedisCallback<T>() {

				@SuppressWarnings("unchecked")
				@Override
				public T doInRedis(RedisConnection conn)
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					byte[] values = valueSerializer.serialize(t);
					
					conn.set(keys, values);
					conn.expire(keys, liveSeconds);
					
					return t;
				}
				
			});
			
		}catch(Exception e){
			logger.error(e, "set data has error. key=[{0}]. value=[{1}]", key, t);
			return null;
		}
	}

	@Override
	public Set<String> keys() {
		
		return redisTemplate.execute(new RedisCallback<Set<String>>() {

			@Override
			public Set<String> doInRedis(RedisConnection conn)
					throws DataAccessException {
				byte[] keys = redisTemplate.getStringSerializer().serialize("*");
				Set<byte[]> keyRes = conn.keys(keys);
				Set<String> result = new HashSet<String>();
				for (byte[] bs : keyRes) {
					result.add(redisTemplate.getStringSerializer().deserialize(bs));
				}
				return result;
			}
		});
		
	}

	@Override
	public String randomKey() {
		
		return redisTemplate.randomKey();
	}

	@Override
	public boolean exists(final String key) {
		
		return redisTemplate.execute(new RedisCallback<Boolean>() {

			@Override
			public Boolean doInRedis(RedisConnection conn)
					throws DataAccessException {
				
				return conn.exists(redisTemplate.getStringSerializer().serialize(key));
			}
		});
	}

	@Override
	public <T extends Serializable> T del(final String key) {
		
		return redisTemplate.execute(new RedisCallback<T>() {

			@SuppressWarnings("unchecked")
			@Override
			public T doInRedis(RedisConnection conn)
					throws DataAccessException {
				T t = (T)get(key);
				conn.del(redisTemplate.getStringSerializer().serialize(key));
				return t;
			}
		});
	}

	@Override
	public <T extends Serializable> T get(final String key) {
		
		return redisTemplate.execute(new RedisCallback<T>() {

			@SuppressWarnings("unchecked")
			@Override
			public T doInRedis(RedisConnection conn)
					throws DataAccessException {
				byte[] valBytes = conn.get(redisTemplate.getStringSerializer().serialize(key));
				
				RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
				
				return (T)valueSerializer.deserialize(valBytes);
			}
		});
	}

	@Override
	public boolean expire(final String key, final long liveSeconds) {
		if(!exists(key)){
			return false;
		}
		
		redisTemplate.execute(new RedisCallback<Void>() {

			@Override
			public Void doInRedis(RedisConnection conn)
					throws DataAccessException {
				conn.expire(redisTemplate.getStringSerializer().serialize(key), liveSeconds);
				return null;
			}
		});
		
		return true;
	}

	@Override
	public long incr(final String key) {
		return redisTemplate.execute(new RedisCallback<Long>() {
			@Override
			public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
				return redisConnection.incr(redisTemplate.getStringSerializer().serialize(key));
			}
		});
	}

	@Override
	public long decr(final String key) {
		return redisTemplate.execute(new RedisCallback<Long>() {
			@Override
			public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
				return redisConnection.decr(redisTemplate.getStringSerializer().serialize(key));
			}
		});
	}

	@SuppressWarnings("unchecked")
	@Override
	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		this.redisTemplate = (RedisTemplate<String, String>) context.getBean("redisTemplate");
		CyberarkV9Service cyberarkV9Service =(CyberarkV9Service) context.getBean("cyberarkV9Service");
		JedisConnectionFactory jedisConnectionFactory =(JedisConnectionFactory)redisTemplate.getConnectionFactory();
		String password= cyberarkV9Service.getPassword("ilifecore.dmz.redis.password");
		if(password==null){
			logger.warn("get redis password from V9 failed!");
			return;
		}
		jedisConnectionFactory.setPassword(password);
		jedisConnectionFactory.getShardInfo().setPassword(password);
		jedisConnectionFactory.afterPropertiesSet();
	}
	
	@Override
	public <T extends Serializable> boolean setNX(final String key, final T t) {
		try{
			return redisTemplate.execute(new RedisCallback<Boolean>() {
				@SuppressWarnings("unchecked")
				@Override
				public Boolean doInRedis(RedisConnection conn)
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					byte[] values = valueSerializer.serialize(t);
					return conn.setNX(keys,values);
				}
				
			});
			
		}catch(Exception e){
			logger.error(e, "setNX data has error. key=[{0}]. value=[{1}]", key, t);
			return false;
		}
	}
	
	
	@Override
	public <T extends Serializable> T  getSet(final String key, final T t) {
		try{
			return redisTemplate.execute(new RedisCallback<T>() {
				@SuppressWarnings("unchecked")
				@Override
				public T doInRedis(RedisConnection conn)
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					byte[] values = valueSerializer.serialize(t);
					return (T)valueSerializer.deserialize(conn.getSet(keys, values));
				}
				
			});
			
		}catch(Exception e){
			logger.error(e, "getSet data has error. key=[{0}]. value=[{1}]", key, t);
			return null;
		}
	}

	@Override
	public <T extends Serializable> long lpush(final String key, final T t) {
		try {
			return redisTemplate.execute(new RedisCallback<Long>() {
				public Long doInRedis(RedisConnection conn) 
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					byte[] values = valueSerializer.serialize(t);
					return conn.lPush(keys, values);
				}
			});
		} catch (Exception e) {
			logger.error(e, "lpush data has error. key=[{0}].value=[{1}]", key, t);
			return 0l;
		}
		
	}

	@Override
	public List lrange(final String key, final long start, final long end) {
		try {
			return redisTemplate.execute(new RedisCallback<List>() {
				public List doInRedis(RedisConnection conn) 
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					List list = conn.lRange(keys, start, end);
					List<Object> objects = new ArrayList<Object>();
					for(Object object : list){
						objects.add(valueSerializer.deserialize((byte[]) object));
					}
					return  objects;
				}
			});
		} catch (Exception e) {
			logger.error(e, "lrange data has error. key=[{0}]. start=[{1}]. end=[{2}]", key, start, end);
			return null;
		}
	}

	@Override
	public boolean ltrim(final String key, final long start, final long end) {
		try {
			return redisTemplate.execute(new RedisCallback<Boolean>() {
				public Boolean doInRedis(RedisConnection conn) 
					throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					conn.lTrim(keys, start, end);
					return true;
				}
			});
		} catch (Exception e) {
			logger.error(e, "ltrim data has error. key=[{0}]. start=[{1}]. end=[{2}]", key, start, end);
			return false;
		}
	}


	@Override
	public long lpop(final String key) {
		try {
			return redisTemplate.execute(new RedisCallback<Long>() {
				public Long doInRedis(RedisConnection conn) 
						throws DataAccessException {
					byte[] keys = redisTemplate.getStringSerializer().serialize(key);
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					 conn.lPop(keys);
					 return 1l;
				}
			});
		} catch (Exception e) {
			logger.error(e, "lpop data has error. key=[{0}]]", key);
			return 0l;
		}
	}
	
	@Override
	public void batchPipelineSet(final List<String> keyList,final List<Object> dataList, final long expire) {
        //使用pipeline方式
        redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
            	for(int i = 0; i < keyList.size();i++){
            		String key = keyList.get(i);
            		byte[] rawKey = redisTemplate.getStringSerializer().serialize(key);
            		@SuppressWarnings("unchecked")
					RedisSerializer<Object> valueSerializer = (RedisSerializer<Object>) redisTemplate.getValueSerializer();
					byte[] value = valueSerializer.serialize(dataList.get(i));
            		connection.setEx(rawKey, expire, value);
            	}
                return null;
            }
        });
 
    }

	
}