|
springmvc + mybatis +redis 没有调研完成的 缓存引入,
查找了各种资料,包括【Iteye上的大神:http://liuyieyer.iyunv.com/blog/2081382】
【github上的大神:https://github.com/mybatis/redis-cache】
package xx.redis;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
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;
public final class RedisCache implements Cache {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private String id;
public RedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
this.id = id;
}
private Object execute(RedisCallback callback) {
Jedis jedis = CachePool.getInstance().getJedis();
try {
return callback.doWithRedis(jedis);
} finally {
// jedis.close();
jedis.quit();
}
}
public String getId() {
return this.id;
}
public int getSize() {
return (Integer) execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
Map<byte[], byte[]> result = jedis.hgetAll(id.toString().getBytes());
return result.size();
}
});
}
public void putObject(final Object key, final Object value) {
execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
jedis.hset(id.toString().getBytes(), key.toString().getBytes(), SerializeUtil.serialize(value));
return null;
}
});
}
public Object getObject(final Object key) {
return execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
Object val = SerializeUtil.unserialize(jedis.hget(id.toString().getBytes(), key.toString().getBytes()));
System.out.println("get from redis:id=" + key + ",val=" + val);
return val;
}
});
}
public Object removeObject(final Object key) {
return execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
return jedis.hdel(id.toString(), key.toString());
}
});
}
public void clear() {
execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
jedis.del(id.toString());
return null;
}
});
}
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
@Override
public String toString() {
return "Redis {" + id + "}";
}
/**
*
* @ClassName: CachePool
* @Description: TODO(单例Cache池)
* @author LiuYi
*/
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();
Properties p = new Properties();
InputStream f = CachePool.class.getClassLoader().getResourceAsStream("redis.properties");
try {
p.load(f);
} catch (IOException e) {
e.printStackTrace();
}
config.setMaxIdle(Integer.valueOf(p.getProperty("redis.maxIdle")));
config.setMaxWait(Integer.valueOf(p.getProperty("redis.maxWait")));
pool = new JedisPool(config, p.getProperty("redis.host"));
}
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;
}
}
}
================================================
package xx.redis;
import redis.clients.jedis.Jedis;
public interface RedisCallback {
Object doWithRedis(Jedis jedis);
}
================================================
package xx.redis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.ibatis.cache.CacheException;
public final 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) {
throw new CacheException(e);
}
}
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) {
throw new CacheException(e);
}
}
}
================================================
redis.properties 文件:
#redis configuration
redis.host=172.16.180.75
redis.port=6379
redis.pass=
redis.default.db=0
redis.timeout=100000
redis.maxActive=300
redis.maxIdle=100
redis.maxWait=1000
DBSync.testOnBorrow=true
====================================================
mybatis-config.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" />
<!-- <setting name="lazyLoadingEnabled" value="true" /> -->
<!-- <setting name="multipleResultSetsEnabled" value="true" /> -->
<!-- <setting name="useColumnLabel" value="true" /> -->
<!-- <setting name="useGeneratedKeys" value="false" /> -->
<!-- <setting name="enhancementEnabled" value="false" /> -->
<!-- <setting name="defaultExecutorType" value="SIMPLE" /> -->
</settings>
</configuration>
spring-mybatis文件
<!-- mybatis文件配置,扫描所有mapper文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations">
<array>
<value>classpath:conf-mybatis/ext/*Mapper.xml</value>
<value>classpath:conf-mybatis/*Mapper.xml</value>
</array>
</property>
<property name="configLocation" value="classpath:conf-mybatis/mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
<property name="plugins">
<ref bean="pageHelper" />
</property>
</bean>
=============================================================
|
|
|