SpringMVC+Mybatis+MySQL配置Redis緩存

SpringMVC+Mybatis+MySQL配置Redis緩存

1.準備環境:

SpringMVC:spring-framework-4.3.5.RELEASE-disthtml

Mybatis:3.4.2java

MySQL:5.0mysql

JDK:1.8redis

IDE:Eclipse4.6.1spring

以及配置好的SpringMVC+Mybatis項目sql

2.須要添加的jar包

jedis-2.9.0.jar數據庫

或者使用POM配置apache

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

3.配置

配置分爲如下幾個部分:數組

一、Java使用Jedis實現Mybatis的Cache接口,RedisCache.java緩存

package redisCache;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.ibatis.cache.Cache;
import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import tool.SerializeUtil;

public class RedisCache implements Cache {

    private static Logger logger = Logger.getLogger(RedisCache.class);
    /* 建立訪問Redis數據庫的Redis客戶端 */
    private Jedis redisClient = createReids();
    /* 讀寫鎖 */
    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");
        }
        logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>RedisCache:id=" + id);
        this.id = id;
    }

    @Override
    public void clear() {
        redisClient.flushDB();
    }

    @Override
    public String getId() {
        return this.id;
    }

    @Override
    public Object getObject(Object key) {
        Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));
        logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "    value=" + value);
        return value;
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        return readWriteLock;
    }

    @Override
    public int getSize() {
        return Integer.valueOf(redisClient.dbSize().toString());
    }

    @Override
    public void putObject(Object key, Object value) {
        logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "    value=" + value);
        redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));
    }

    @Override
    public Object removeObject(Object key) {
        return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);
    }

    protected static Jedis createReids() {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1");
        Jedis result = pool.getResource();
        return result;
    }

}

​ RedisCache文件結構以下

​ Tool包下的序列化工具SerializeUtil.java

package tool;

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;
    }
}

二、配置Mybatis開啓緩存

​ 配置SqlMapConfig.xml添加一下屬性

<configuration>
    ...
    <settings>
        ...
        <!-- 這個配置使全局的映射器啓用或禁用緩存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 對於未知的SQL查詢,容許返回不一樣的結果集以達到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 配置默認的執行器。SIMPLE 執行器沒有什麼特別之處。REUSE 執行器重用預處理語句。BATCH 執行器重用語句和批量更新 -->
        <setting name="defaultExecutorType" value="REUSE" />
        <!-- 全局啓用或禁用延遲加載。當禁用時,全部關聯對象都會即時加載。 -->
        <setting name="lazyLoadingEnabled" value="false" />
        <setting name="aggressiveLazyLoading" value="true" />
        <!-- 全局性地啓用或禁用運行時字節碼加強,以優化訪問Java Bean屬性的性能,同時優化延遲加載的性能。 -->
        <!-- <setting name="enhancementEnabled" value="true"/> -->
        <!-- 設置超時時間,它決定驅動等待一個數據庫響應的時間。 -->
        <setting name="defaultStatementTimeout" value="25000" />
        ...
    </settings>
    ...
</configuration>

三、在Mapper.xml中使用緩存

​ 舉例,如我使用的TbUserMapperCustom.xml,在其中添加使用緩存

<mapper namespace="mapper.TbUserMapperCustom">  
    ...
    <!-- 淘汰模式爲LRU,使用RedisCache來實現緩存 -->
    <cache eviction="LRU" type="redisCache.RedisCache" />
    ...
</mapper>

四、使用效果



四、注意事項

​ 一、在緩存的過程當中,須要把對象序列化轉化爲字節數組存入,那麼須要緩存的Bean類就須要實現Serializable接口

​ 二、因爲我爲了Bean類的擴展性沒有直接使用Mybatis逆向工程生成的原始類,而是繼承了原TbUser,使用TbUserCustom,若是僅僅是TbUserCustom實現了Serializable接口而父類沒有實現Serializable接口的話,在序列化、反序列化的過程當中將沒法對數據進行正確的讀寫,讀出來的對象將爲空,因此若是要傳輸的數據有父類的話,那麼父類也須要實現Serializable接口

​ 三、在使用前你確定須要打開Redis服務


轉載請標明出處:http://www.cnblogs.com/MoEee/p/6490573.html

相關文章
相關標籤/搜索