5分鐘帶你入門Redis做Mybatis二級緩存

 

一、mybatis 查詢緩存:

1.mybatis 提供查詢一級緩存和二級緩存,減輕數據庫的壓力,提高性能。
 
 
2.一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區域)數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束後該sqlSession中的一級緩存也就不存在了。Mybatis默認開啓一級緩存。

 

3.二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
 
  二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啓二級緩存需要在setting全局參數中配置開啓二級緩存。
如果緩存中有數據就不用從數據庫中獲取,大大提高系統性能。
 
4.二級緩存需要查詢結果映射的pojo對象實現java.io.Serializable接口實現序列化和反序列化操作,注意如果存在父類、成員pojo都需要實現序列化接口。
pojo類實現序列化接口是爲了將緩存數據取出執行反序列化操作,因爲二級緩存數據存儲介質多種多樣,不一定在內存有可能是硬盤或者遠程服務器。

 

二、mybatis整合redis

mybatis只提供了一個cache的接口,如果要實現緩存的邏輯,自己實現cache接口即可。

1.導入jedis.jar
2.配置spring-context-redis.xml
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="300" /> <!-- 最大能夠保持idel狀態的對象數  -->
        <property name="maxTotal" value="60000" /> <!-- 最大分配的對象數 -->
        <property name="testOnBorrow" value="true" /> <!-- 當調用borrow Object方法時,是否進行有效性檢查 -->
    </bean>
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1" value="${redis.host}" />
        <constructor-arg index="2" value="${redis.port}" type="int" />
        <!-- <constructor-arg index="3" value="${redis.timeout}" type="int" />
        <constructor-arg index="4" value="${redis.password}"/>
        <constructor-arg index="5" value="${redis.database}" type="int" />
        <constructor-arg index="6" value="${redis.clientName}"/> -->
    </bean>
mybatis-config.xml
        <!-- 使全局的映射器啓用或禁用緩存。 -->
        <setting name="cacheEnabled" value="true"/>
 

三、代碼實現:

 
1.把model序列化
public class UserModel implements Serializable{
    private static final long serialVersionUID = 4673186153813605228L;
}
2.對於mapper.xml開二級緩存
    <!--  開啓二級緩存-->
    <cache eviction="LRU" type="com.lsqz.util.redis.RedisCache" />
總結: 在UserMapper.xml中開啓二緩存,UserMapper.xml下的sql執行完成會存儲到它的緩存區域(HashMap)。
3.在對應的statement 上開啓緩存,默認是關閉的    
<select id="selectByLoginname" resultType="com.**.Model" useCache="true">
4. mybatis刷新緩存(就是清空緩存)

在mapper的同一個namespace中,如果有其它insert、update、delete操作數據後需要刷新緩存,如果不執行刷新緩存會出現髒讀。

 設置statement配置中的flushCache='true' 屬性,默認情況下爲true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現髒讀。

如下:
<insertid='insertUser' parameterType='com.**.User' flushCache='true'>
總結:一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存默認情況下爲true,我們不用去設置它,這樣可以避免數據庫髒讀。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章