mybatis結合redis實戰二級緩衝(六)

來源:互聯網
上載者:User

標籤:factor   pre   http   value   orm   查看   支援   flush   space   

之前的文章中我們意見分析了一級緩衝、二級緩衝的相關源碼和基本原理,今天我們來分享下了mybatis二級緩衝和redis的結合,當然mybatis二級緩衝也可以和ehcache、memcache、OSCache、Hazelcast結合使用。二級緩衝相關的源碼分享請參考《Mybatis源碼分析之Cache二級緩衝原理》。我們通過兩種方式來實戰,一種是自己編寫緩衝、另外一種是官方給出的demo地址:http://www.mybatis.org/redis-cache/

一:自訂mybatis緩衝


    我們知道任何mybatis二級緩衝都需要實現一個介面,這個介面就是org.apache.ibatis.cache.Cache,代碼如下:

package com.demo.spring.mybatis.cache;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.ibatis.cache.Cache;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.demo.spring.mybatis.util.SerializeUtil;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class MybatisRedisCache implements Cache {private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);private Jedis redisClient = createReids();private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();private String id;public MybatisRedisCache(final String id) {if (id == null) {throw new IllegalArgumentException("Cache instances require an ID");}logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);this.id = id;}@Overridepublic String getId() {return this.id;}@Overridepublic int getSize() {return Integer.valueOf(redisClient.dbSize().toString());}@Overridepublic void putObject(Object key, Object value) {logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));}@Overridepublic Object getObject(Object key) {Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);return value;}@Overridepublic Object removeObject(Object key) {return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);}@Overridepublic void clear() {redisClient.flushDB();}@Overridepublic ReadWriteLock getReadWriteLock() {return readWriteLock;}protected static Jedis createReids() {JedisPool pool = new JedisPool("127.0.0.1", 6379);return pool.getResource();}}


以上代碼很簡單就是基本的Cache實現,在定義一個序列化的工具類


  package com.demo.spring.mybatis.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public 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) {ByteArrayInputStream bais = null;try {// 還原序列化bais = new ByteArrayInputStream(bytes);ObjectInputStream ois = new ObjectInputStream(bais);return ois.readObject();} catch (Exception e) {}return null;}}



然後在mapper.xml配置

<cache eviction="LRU" type="com.demo.spring.mybatis.cache.MybatisRedisCache"/>

當然在主設定檔裡面還需要配置如下代碼,代表開啟二級緩衝,預設是不開啟的

<setting name="cacheEnabled" value="true" />


所以得配置和代碼都已經完成了運行結果如下:



為什麼第二次走的是一級緩衝呢?

這個在講二級緩衝源碼的時候分析過,只有當執行commit的時候才把之前查詢的結果放入緩衝。



開啟嗎redis查看如下,因為存入的是序列化的結果,不過我們隱約還是能看到一些資訊到




二:官方的執行個體


 地址: http://www.mybatis.org/redis-cache/


 其實和我們自訂的差不多的,不過使用的時候需要注意redis用戶端版本要和它的版本相容,否則或報錯。

 mybatis-redis 1.0.0-beta2 對應負redis.clients ? jedis 2.8.0  目前的最高版本2.9.0不支援



來源: http://www.ccblog.cn/91.htm



null

mybatis結合redis實戰二級緩衝(六)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.