1. 程式人生 > >Mybatis redis 快取配置

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

eviction="FIFO"flushInterval="10000"size="1024"readOnly="true"type="com.sdzn.basedata.controller.RedisCache"></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

="true"type="com.sdzn.basedata.controller.RedisCache"></cache>

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介面