SpringMVC+Mybatis+MySQL配置Redis缓存

SpringMVC+Mybatis+MySQL配置Redis缓存

1.准备环境:

SpringMVC:spring-framework-4.3.5.RELEASE-dist

Mybatis:3.4.2

MySQL:5.0

JDK:1.8

IDE:Eclipse4.6.1

以及配置好的SpringMVC+Mybatis项目

2.需要添加的jar包

jedis-2.9.0.jar

或者使用POM配置

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

3.配置

配置分为以下几个部分:

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

2、配置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>

3、在Mapper.xml中使用缓存

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

<mapper namespace="mapper.TbUserMapperCustom">	
  	...
  	<!-- 淘汰模式为LRU,使用RedisCache来实现缓存 -->
	<cache eviction="LRU" type="redisCache.RedisCache" />
  	...
</mapper>

4、使用效果



4、注意事项

​ 1、在缓存的过程中,需要把对象序列化转化为字节数组存入,那么需要缓存的Bean类就需要实现Serializable接口

​ 2、由于我为了Bean类的扩展性没有直接使用Mybatis逆向工程生成的原始类,而是继承了原TbUser,使用TbUserCustom,如果仅仅是TbUserCustom实现了Serializable接口而父类没有实现Serializable接口的话,在序列化、反序列化的过程中将无法对数据进行正确的读写,读出来的对象将为空,所以如果要传输的数据有父类的话,那么父类也需要实现Serializable接口

​ 3、在使用前你肯定需要打开Redis服务


转载请标明出处:http://www.cnblogs.com/MoEee/p/6490573.html

posted @ 2017-03-02 14:49  MoEee  阅读(1942)  评论(0编辑  收藏  举报