在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。
- package cn.seafood.cache;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.apache.ibatis.cache.Cache;
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPool;
- import redis.clients.jedis.JedisPoolConfig;
- import redis.clients.jedis.exceptions.JedisConnectionException;
- import cn.seafood.util.PropertiesLoader;
- /**
- *
- * @ClassName: RedisCache
- * @Description: TODO(使用第三方缓存服务器redis,处理二级缓存)
- * @author LiuYi
- * @date 2014年6月9日 下午1:37:46
- *
- */
- public class RedisCache implements Cache {
- private static Log log = LogFactory.getLog(RedisCache.class);
- /** The ReadWriteLock. */
- private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
- private String id;
- public RedisCache(final String id) {
- if (id == null) {
- throw new IllegalArgumentException("必须传入ID");
- }
- log.debug("MybatisRedisCache:id=" + id);
- this.id=id;
- }
- @Override
- public String getId() {
- return this.id;
- }
- @Override
- public int getSize() {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- ;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- result = Integer.valueOf(jedis.dbSize().toString());
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- return result;
- }
- @Override
- public void putObject(Object key, Object value) {
- if(log.isDebugEnabled())
- log.debug("putObject:" + key.hashCode() + "=" + value);
- if(log.isInfoEnabled())
- log.info("put to redis sql :" +key.toString());
- Jedis jedis = null;
- JedisPool jedisPool = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- jedis.set(SerializeUtil.serialize(key.hashCode()), SerializeUtil.serialize(value));
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- }
- @Override
- public Object getObject(Object key) {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- Object value = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- value = SerializeUtil.unserialize(jedis.get(SerializeUtil.serialize(key.hashCode())));
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- if(log.isDebugEnabled())
- log.debug("getObject:" + key.hashCode() + "=" + value);
- return value;
- }
- @Override
- public Object removeObject(Object key) {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- Object value = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- );
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- if(log.isDebugEnabled())
- log.debug("getObject:" + key.hashCode() + "=" + value);
- return value;
- }
- @Override
- public void clear() {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- jedis.flushDB();
- jedis.flushAll();
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- }
- @Override
- public ReadWriteLock getReadWriteLock() {
- return readWriteLock;
- }
- /**
- *
- * @ClassName: CachePool
- * @Description: TODO(单例Cache池)
- * @author LiuYi
- * @date 2014年6月17日 上午10:50:52
- *
- */
- public static class CachePool {
- JedisPool pool;
- private static final CachePool cachePool = new CachePool();
- public static CachePool getInstance(){
- return cachePool;
- }
- private CachePool() {
- JedisPoolConfig config = new JedisPoolConfig();
- );
- config.setMaxWaitMillis(1000l);
- PropertiesLoader pl = new PropertiesLoader("classpath:config/redis.properties");
- pool = new JedisPool(config,pl.getProperty("redisvip"));
- }
- public Jedis getJedis(){
- Jedis jedis = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = pool.getResource();
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- pool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- pool.returnResource(jedis);
- }
- jedis = pool.getResource();
- return jedis;
- }
- public JedisPool getJedisPool(){
- return this.pool;
- }
- }
- public static class SerializeUtil {
- public static byte[] serialize(Object object) {
- ObjectOutputStream oos = null;
- ByteArrayOutputStream baos = null;
- try {
- // 序列化
- baos = new ByteArrayOutputStream();
- oos = new ObjectOutputStream(baos);
- oos.writeObject(object);
- byte[] bytes = baos.toByteArray();
- return bytes;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- public static Object unserialize(byte[] bytes) {
- if(bytes == null)return null;
- ByteArrayInputStream bais = null;
- try {
- // 反序列化
- bais = new ByteArrayInputStream(bytes);
- ObjectInputStream ois = new ObjectInputStream(bais);
- return ois.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
- }