shiro 在集群环境下用redis(集群版)做session共享

如今集群环境已是服务器主流,在集群环境中,session共享一般通过应用服务器的session复制或者存储在公用的缓存服务器上,本文主要介绍通过Shiro管理session,并将session缓存到redis集群版中,这样可以在集群中使用。

Shiro除了在管理session上使用redis,也在可以缓存用户权限,即cacheManager可以通过redis来扩展。

下面从 sessionManager这部分讲解Shiro与Redis的集成,

先看下配置问件:

/cityparlor/cityparlor/**=anon 
/cityparlor/**=authc 
/common/**=anon 
/cityparlor/cityparlor/**=anon 
/cityparlor/**=authc /common/**=anon

 

shiro框架中有一个对session配置管理对象:sessionManager对象,对象中可注入对象参数:sessionDAO,源码如下:

此SessionDao中封装内容如下:

不难发现,里面封装的就是对session的增删改查,因此我们只需对sessionDao进行自己的继承,实现类即可;

自己封装代码如下:

package com.cityparlor.web.admin.realm;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cityparlor.common.utils.JedisUtils;

public class RedisSessionDAO extends AbstractSessionDAO{
	private static Logger logger = LoggerFactory.getLogger(RedisSessionDAO.class);
	/*private JedisUtils redisManager;*/
	private String keyPrefix;
	private int expire = 0;
	

	public RedisSessionDAO() {
		this.keyPrefix = "shiro_redis_session:";
	}

	@Override
	public void update(Session session) throws UnknownSessionException {
		// TODO Auto-generated method stub
		this.saveSession(session);
	}
	
	/**
	 * 获取序列化字节id
	 * TODO
	 * @param sessionId
	 * @return

	 * ============History===========

	 * 2017年7月17日   LHL    新建
	 */
	/*
    private byte[] getByteKey(Serializable sessionId) {
		String preKey = this.keyPrefix + sessionId;
		return preKey.getBytes();
	}
    */
	private String getKey(Serializable sessionId) {
		String preKey = this.keyPrefix + sessionId;
		return preKey;
	}
	
	private void saveSession(Session session) throws UnknownSessionException {
		if ((session == null) || (session.getId() == null)) {
			logger.error("session or session id is null");
			return;
		}

		String key = getKey(session.getId());
		/*byte[] value = SerializeUtils.serialize(session);*/
		session.setTimeout(expire * 1000);
		JedisUtils.setObject(key, session, this.expire);//this.redisManager.set(key, value, this.redisManager.getExpire());
	}
	
	
	@Override
	public void delete(Session session) {
		if ((session == null) || (session.getId() == null)) {
			logger.error("session or session id is null");
			return;
		}
		JedisUtils.delObject(getKey(session.getId()));//this.redisManager.del(getByteKey(session.getId()));
		
	}

	@Override
	public Collection getActiveSessions() {
		// TODO Auto-generated method stub
		Set sessions = new HashSet();

		Set keys = JedisUtils.keys(this.keyPrefix + "*");
		if ((keys != null) && (keys.size() > 0)) {
			for (String key : keys) {
				Session s = (Session) JedisUtils.getObject(key);// (Session) SerializeUtils.deserialize(this.redisManager.get(key));
				sessions.add(s);
			}
		}

		return sessions;
	}

	@Override
	protected Serializable doCreate(Session session) {
		// TODO Auto-generated method stub
		Serializable sessionId = generateSessionId(session);
		assignSessionId(session, sessionId);
		saveSession(session);
		return sessionId;
	}

	@Override
	protected Session doReadSession(Serializable sessionId) {
		// TODO Auto-generated method stub
		if (sessionId == null) {
			logger.error("session id is null");
			return null;
		}

		Session s =(Session) JedisUtils.getObject(getKey(sessionId)) ;// SerializeUtils.deserialize(this.redisManager.get(getByteKey(sessionId)));
		return s;
	}

}
	
 

这里我们只是将session的增删改查换成了用redis的增删改查;

redis链接工具类代码如下:

/**
 * 
 */
package com.cityparlor.common.utils;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cityparlor.common.config.Global;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;

/**
 * Jedis Cache 工具类
 * 
 * @author Administrator
 * @version 2015-09-29
 */
public class JedisUtils {

	private static Logger logger = LoggerFactory.getLogger(JedisUtils.class);
	
	private static JedisCluster jedisCluster = SpringContextHolder.getBean(JedisCluster.class);
	//private static JedisPool jedisPool = SpringContextHolder.getBean(JedisPool.class);

	public static final String KEY_PREFIX = Global.getConfig("redis.keyPrefix");
	
	/**
	 * 利用redis 生成自增长的长整形主键
	 * */
	
	
	/**
	 * 获取所有keys
	 * TODO
	 * @param pattern
	 * @return

	 * ============History===========

	 * 2017年7月17日   LHL    新建
	 */
	 public static TreeSet keys(String pattern){  
	        //logger.debug("Start getting keys...");  
	        TreeSet keys = new TreeSet<>();  
	        Map clusterNodes = jedisCluster.getClusterNodes();  
	        for(String k : clusterNodes.keySet()){  
	         //   logger.debug("Getting keys from: {}", k);  
	            JedisPool jp = clusterNodes.get(k);  
	            Jedis connection = jp.getResource();  
	            try {  
	                keys.addAll(connection.keys(pattern));  
	            } catch(Exception e){  
	                logger.error("Getting keys error: {}", e);  
	            } finally{  
	                logger.debug("Connection closed.");  
	                connection.close();//用完一定要close这个链接!!!  
	            }  
	        }  
	       // logger.debug("Keys gotten!");  
	        return keys;  
	    }  
	/**
	 * 获取缓存
	 * @param key 键
	 * @return 值
	 */
	public static String get(String key) {
		key = KEY_PREFIX + key;
		String value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				value = jedisCluster.get(key);
				value = StringUtils.isNotBlank(value) && !"nil".equalsIgnoreCase(value) ? value : null;
				logger.debug("get {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("get {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 获取缓存
	 * @param key 键
	 * @return 值
	 */
	public static Object getObject(String key) {
		key = KEY_PREFIX + key;
		Object value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				value = toObject(jedisCluster.get(getBytesKey(key)));
				logger.debug("getObject {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getObject {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 设置缓存,利用setex
	 * @param key
	 * @param seconds
	 * @param value
	 * @return
	 */
	public static String setex(String key, int seconds, String value){
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.setex(key, seconds, value);
			logger.debug("setex {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setex {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 设置缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static String set(String key, String value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.set(key, value);
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("set {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("set {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 设置缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static String setObject(String key, Object value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.set(getBytesKey(key), toBytes(value));
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setObject {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setObject {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 获取List缓存
	 * @param key 键
	 * @return 值
	 */
	public static List getList(String key) {
		key = KEY_PREFIX + key;
		List value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				value = jedisCluster.lrange(key, 0, -1);
				logger.debug("getList {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getList {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 获取List缓存
	 * @param key 键
	 * @return 值
	 */
	public static List getObjectList(String key) {
		key = KEY_PREFIX + key;
		List value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				List list = jedisCluster.lrange(getBytesKey(key), 0, -1);
				value = Lists.newArrayList();
				for (byte[] bs : list){
					value.add(toObject(bs));
				}
				logger.debug("getObjectList {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getObjectList {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 设置List缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static long setList(String key, List value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				jedisCluster.del(key);
			}
			result = jedisCluster.rpush(key, (String[])value.toArray());
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setList {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setList {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 设置List缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static long setObjectList(String key, List value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				jedisCluster.del(key);
			}
			List list = Lists.newArrayList();
			for (Object o : value){
				list.add(toBytes(o));
			}
			result = jedisCluster.rpush(getBytesKey(key), (byte[][])list.toArray());
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setObjectList {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setObjectList {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 向List缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long listAdd(String key, String... value) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.rpush(key, value);
			logger.debug("listAdd {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("listAdd {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 向List缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long listObjectAdd(String key, Object... value) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			List list = Lists.newArrayList();
			for (Object o : value){
				list.add(toBytes(o));
			}
			result = jedisCluster.rpush(getBytesKey(key), (byte[][])list.toArray());
			logger.debug("listObjectAdd {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("listObjectAdd {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}

	/**
	 * 获取缓存
	 * @param key 键
	 * @return 值
	 */
	public static Set getSet(String key) {
		key = KEY_PREFIX + key;
		Set value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				value = jedisCluster.smembers(key);
				logger.debug("getSet {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getSet {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 获取缓存
	 * @param key 键
	 * @return 值
	 */
	public static Set getObjectSet(String key) {
		key = KEY_PREFIX + key;
		Set value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				value = Sets.newHashSet();
				Set set = jedisCluster.smembers(getBytesKey(key));
				for (byte[] bs : set){
					value.add(toObject(bs));
				}
				logger.debug("getObjectSet {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getObjectSet {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 设置Set缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static long setSet(String key, Set value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		String[] var = {};
		value.toArray(var);
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				jedisCluster.del(key);
			}
			result = jedisCluster.sadd(key, value.toArray(var));
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setSet {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setSet {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 设置Set缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static long setObjectSet(String key, Set value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				jedisCluster.del(key);
			}
			Set set = Sets.newHashSet();
			for (Object o : value){
				set.add(toBytes(o));
			}
			result = jedisCluster.sadd(getBytesKey(key), (byte[][])set.toArray());
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setObjectSet {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setObjectSet {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 向Set缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long setSetAdd(String key, String... value) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.sadd(key, value);
			logger.debug("setSetAdd {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setSetAdd {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}

	/**
	 * 向Set缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long setSetObjectAdd(String key, Object... value) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			Set set = Sets.newHashSet();
			for (Object o : value){
				set.add(toBytes(o));
			}
			result = jedisCluster.rpush(getBytesKey(key), (byte[][])set.toArray());
			logger.debug("setSetObjectAdd {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setSetObjectAdd {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 获取Map缓存
	 * @param key 键
	 * @return 值
	 */
	public static Map getMap(String key) {
		key = KEY_PREFIX + key;
		Map value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				value = jedisCluster.hgetAll(key);
				logger.debug("getMap {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getMap {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 获取Map缓存
	 * @param key 键
	 * @return 值
	 */
	public static Map getObjectMap(String key) {
		key = KEY_PREFIX + key;
		Map value = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				value = Maps.newHashMap();
				Map map = jedisCluster.hgetAll(getBytesKey(key));
				for (Map.Entry e : map.entrySet()){
					value.put(StringUtils.toString(e.getKey()), toObject(e.getValue()));
				}
				logger.debug("getObjectMap {} = {}", key, value);
			}
		} catch (Exception e) {
			logger.warn("getObjectMap {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return value;
	}
	
	/**
	 * 设置Map缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static String setMap(String key, Map value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)) {
				jedisCluster.del(key);
			}
			result = jedisCluster.hmset(key, value);
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setMap {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setMap {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 设置Map缓存
	 * @param key 键
	 * @param value 值
	 * @param cacheSeconds 超时时间,0为不超时
	 * @return
	 */
	public static String setObjectMap(String key, Map value, int cacheSeconds) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))) {
				jedisCluster.del(key);
			}
			Map map = Maps.newHashMap();
			for (Map.Entry e : value.entrySet()){
				map.put(getBytesKey(e.getKey()), toBytes(e.getValue()));
			}
			result = jedisCluster.hmset(getBytesKey(key), (Map)map);
			if (cacheSeconds != 0) {
				jedisCluster.expire(key, cacheSeconds);
			}
			logger.debug("setObjectMap {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("setObjectMap {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 向Map缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static String mapPut(String key, Map value) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.hmset(key, value);
			logger.debug("mapPut {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("mapPut {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 向Map缓存中添加值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static String mapObjectPut(String key, Map value) {
		key = KEY_PREFIX + key;
		String result = null;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			Map map = Maps.newHashMap();
			for (Map.Entry e : value.entrySet()){
				map.put(getBytesKey(e.getKey()), toBytes(e.getValue()));
			}
			result = jedisCluster.hmset(getBytesKey(key), (Map)map);
			logger.debug("mapObjectPut {} = {}", key, value);
		} catch (Exception e) {
			logger.warn("mapObjectPut {} = {}", key, value, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 移除Map缓存中的值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long mapRemove(String key, String mapKey) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.hdel(key, mapKey);
			logger.debug("mapRemove {}  {}", key, mapKey);
		} catch (Exception e) {
			logger.warn("mapRemove {}  {}", key, mapKey, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 移除Map缓存中的值
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static long mapObjectRemove(String key, String mapKey) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.hdel(getBytesKey(key), getBytesKey(mapKey));
			logger.debug("mapObjectRemove {}  {}", key, mapKey);
		} catch (Exception e) {
			logger.warn("mapObjectRemove {}  {}", key, mapKey, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 判断Map缓存中的Key是否存在
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static boolean mapExists(String key, String mapKey) {
		key = KEY_PREFIX + key;
		boolean result = false;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.hexists(key, mapKey);
			logger.debug("mapExists {}  {}", key, mapKey);
		} catch (Exception e) {
			logger.warn("mapExists {}  {}", key, mapKey, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 判断Map缓存中的Key是否存在
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public static boolean mapObjectExists(String key, String mapKey) {
		key = KEY_PREFIX + key;
		boolean result = false;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.hexists(getBytesKey(key), getBytesKey(mapKey));
			logger.debug("mapObjectExists {}  {}", key, mapKey);
		} catch (Exception e) {
			logger.warn("mapObjectExists {}  {}", key, mapKey, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 删除缓存
	 * @param key 键
	 * @return
	 */
	public static long del(String key) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(key)){
				result = jedisCluster.del(key);
				logger.debug("del {}", key);
			}else{
				logger.debug("del {} not exists", key);
			}
		} catch (Exception e) {
			logger.warn("del {}", key, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}

	/**
	 * 删除缓存
	 * @param key 键
	 * @return
	 */
	public static long delObject(String key) {
		key = KEY_PREFIX + key;
		long result = 0;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			if (jedisCluster.exists(getBytesKey(key))){
				result = jedisCluster.del(getBytesKey(key));
				logger.debug("delObject {}", key);
			}else{
				logger.debug("delObject {} not exists", key);
			}
		} catch (Exception e) {
			logger.warn("delObject {}", key, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 缓存是否存在
	 * @param key 键
	 * @return
	 */
	public static boolean exists(String key) {
		key = KEY_PREFIX + key;
		boolean result = false;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.exists(key);
			logger.debug("exists {}", key);
		} catch (Exception e) {
			logger.warn("exists {}", key, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 缓存是否存在
	 * @param key 键
	 * @return
	 */
	public static boolean existsObject(String key) {
		key = KEY_PREFIX + key;
		boolean result = false;
		//Jedis jedis = null;
		try {
			//jedis = getResource();
			result = jedisCluster.exists(getBytesKey(key));
			logger.debug("existsObject {}", key);
		} catch (Exception e) {
			logger.warn("existsObject {}", key, e);
		} finally {
			//returnResource(jedis);
		}
		return result;
	}

	/**
	 * 获取资源
	 * @return
	 * @throws JedisException
	 */
	/*public static Jedis getResource() throws JedisException {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			logger.debug("getResource.", jedis);
		} catch (JedisException e) {
			logger.warn("getResource.", e);
			returnBrokenResource(jedis);
			throw e;
		}
		return jedis;
	}*/

	/**
	 * 归还资源
	 * @param jedis
	 * @param isBroken
	 */
	/*public static void returnBrokenResource(Jedis jedis) {
		if (jedis != null) {
			jedisPool.returnBrokenResource(jedis);
		}
	}*/
	
	/**
	 * 释放资源
	 * @param jedis
	 * @param isBroken
	 */
	/*public static void returnResource(Jedis jedis) {
		if (jedis != null) {
			jedisPool.returnResource(jedis);
		}
	}*/

	/**
	 * 获取byte[]类型Key
	 * @param key
	 * @return
	 */
	public static byte[] getBytesKey(Object object){
		if(object instanceof String){
    		return StringUtils.getBytes((String)object);
    	}else{
    		return ObjectUtils.serialize(object);
    	}
	}
	
	/**
	 * Object转换byte[]类型
	 * @param key
	 * @return
	 */
	public static byte[] toBytes(Object object){
    	return ObjectUtils.serialize(object);
	}

	/**
	 * byte[]型转换Object
	 * @param key
	 * @return
	 */
	public static Object toObject(byte[] bytes){
		return ObjectUtils.unserialize(bytes);
	}
}
	

对redis链接池的封装也可按自己的来,只要将自己实现的RedisSessionDAO中的方法重新定义即可;

 

文章不够详细,如有深究可以参考:http://blog.csdn.net/lishehe/article/details/45224181;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值