Mybatis redis 快取配置
在mybatis中,快取的功能由根介面Cache(org.apache.ibatis.cache.Cache)定義。整個體系採用裝飾器設計模式, 資料儲存和快取的基本功能由PerpetualCache(org.apache.ibatis.cache.impl.PerpetualCache) 永久快取實現,然後通過一系列的裝飾器來對PerpetualCache永久快取進行快取策略等方便的控制用於裝飾PerpetualCache的標準裝飾器共有8個(全部在org.apache.ibatis.cache.decorators包中):
1.FifoCache:先進先出演算法,快取回收策略<cache
2.LoggingCache:輸出快取命中的日誌資訊
3.LruCache:最近最少使用演算法,快取回收策略
<cacheeviction="LRU"flushInterval="10000"size="1024"readOnly="true"type="com.sdzn.basedata.controller.RedisCache"></cache
4.ScheduledCache:排程快取,負責定時清空快取
5.SerializedCache:快取序列化和反序列化儲存
6.SoftCache:基於軟引用實現的快取管理策略
7.SynchronizedCache:同步的快取裝飾器,用於防止多執行緒併發訪問
8.WeakCache:基於弱引用實現的快取管理策略
另外,還有一個特殊的裝飾器TransactionalCache:事務性的快取
配置Mybatis快取
1、第一步:在Mapper.XML配置檔案增加快取配置;
如:
<cacheeviction="FIFO"flushInterval="10000"size="1024"readOnly
2、第二步:建立com.sdzn.basedata.controller.RedisCache快取類;此類必須實現Cache 【org.apache.ibatis.cache.Cache】介面;
/**
*
* redis快取處理類
*
* <p>用於根據sql語句將sql及對應的資料存入redis中
* @author 朱家田 2016年9月22日
* @see Cache
* @since 1.0
*/
publicclass RedisCache implements Cache{
private Jedis redisClient = createReids();
private String id;
privatefinal ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
@Override
public String getId() {
// TODO Auto-generated method stub
returnid;
}
public RedisCache(final String id){
if (id == null) {
thrownew IllegalArgumentException("Cache instances require an ID");
}
this.id = id;
}
publicstaticbyte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
returnbytes;
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}
@Override
publicvoid putObject(Object key, Object value) {
System.err.println("put key" + key);
redisClient.set(serialize(key.toString()),serialize(value));
}
publicstatic Object unserialize(byte[] bytes) {
if (bytes == null)
returnnull;
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
returnois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}
@Override
public Object getObject(Object key) {
System.out.println("get key");
Object value = unserialize(redisClient.get(serialize(key.toString())));
System.out.println(value);
returnvalue;
}
@Override
public Object removeObject(Object key) {
System.err.println("remove key" + key);
returnredisClient.expire(serialize(key.toString()), 0);
}
@Override
publicvoid clear() {
System.err.println("clear all data");
redisClient.flushDB();
}
@Override
publicint getSize() {
return Integer.valueOf(redisClient.dbSize().toString());
}
@Override
public ReadWriteLock getReadWriteLock() {
// TODO Auto-generated method stub
returnreadWriteLock;
}
protectedstatic Jedis createReids() {
JedisPool pool = new JedisPool(new JedisPoolConfig(), "192.168.0.200", 6379,10000,"my_redis");
returnpool.getResource();
}
}
3、第三步 將記錄資料庫資料的Bean類實現Serializable介面