您的位置:首页 > 数据库 > Redis

redis( 4 )redis与Mybatis的无缝整合让MyBatis透明的管理缓存二

2015-08-30 10:32 696 查看
在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。

Java代码


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;

int result = 0;

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();

value = jedis.expire(SerializeUtil.serialize(key.hashCode()), 0);

} 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.setMaxIdle(100);

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: