使用redis做mybatis的二级缓存

原创 2018年04月17日 15:44:56

mybatis-config.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="cacheEnabled" value="true"/>
	</settings>
	
	<typeAliases>
		<package name="com.briup.bean" />
	</typeAliases>
	
	<!-- environments标签改为在spring中的数据源里面配置 -->
	
	<mappers>
		<mapper resource="com/briup/dao/IUserDaoMapper.xml"/>
	</mappers>
</configuration>  

实体类的mapper.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
			"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.briup.dao.IUserDao">
	
	<cache type="com.briup.cache.MybatisRedisCache"></cache>
	<insert id="saveUser" parameterType="User">
		<selectKey resultType="long" keyProperty="id" order="BEFORE">
			select my_seq.nextval from dual
		</selectKey>
		insert into t_user(id,name,age,dob) 
		values(#{id},#{name},#{age},#{dob})
	</insert>
	
	<select id="findAllUsers" resultType="User">
		select id,name,age,dob
		from t_user
	</select>
	
	<select id="findUserByName" parameterType="string" resultType="User">
		select id,name,age,dob
		from t_user
		where name=#{name}
	</select>
	
</mapper>

redis工具类

package com.briup.util;

import java.util.ResourceBundle;

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

public class JedisUtils {
	public static JedisPool jedisPool;

	static {
		//ResourceBundle会查找classpath下的xxx.properties的文件,xxx是方法中指定的
		ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");
		int maxTotal = Integer.parseInt(resourceBundle.getString("redis.pool.maxTotal"));
		int maxIdle = Integer.parseInt(resourceBundle.getString("redis.pool.maxIdle"));
		int maxWait = Integer.parseInt(resourceBundle.getString("redis.pool.maxWait"));
		String ip = resourceBundle.getString("redis.ip");
		int port = Integer.parseInt(resourceBundle.getString("redis.port"));

		JedisPoolConfig config = new JedisPoolConfig();
		// 设置最大连接数
		config.setMaxTotal(maxTotal);
		// 设置最大空闲数
		config.setMaxIdle(maxIdle);
		// 设置超时时间
		config.setMaxWaitMillis(maxWait);
		// 初始化连接池
		jedisPool = new JedisPool(config, ip, port);

	}
	
	public static void set(Object key, Object value) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.set(SerializingUtils.serialize(key), SerializingUtils.serialize(value));
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			jedis.close();
		}
	}

	
	public static Object get(Object key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			byte[] keyBytes = SerializingUtils.serialize(key);
			if(jedis.exists(keyBytes)){
				return SerializingUtils.deserialize(jedis.get(keyBytes));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			jedis.close();
		}
		return null;
	}
	
	public static void del(Object key) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.del(SerializingUtils.serialize(key));
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			jedis.close();
		}
	}
	
	public static void clear() {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.flushDB();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			jedis.close();
		}
	}
	public static int getSize() {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			jedis.close();
		}
		return jedis.dbSize().intValue();
	}
	
	public static Jedis getResource(){
		return jedisPool.getResource();
	}
}

cache工具类

package com.briup.cache;

import java.util.concurrent.locks.ReadWriteLock;

import org.apache.ibatis.cache.Cache;
import org.apache.ibatis.cache.CacheException;

import com.briup.util.JedisUtils;

/**
 * Cache为缓存接口,给缓存供应商的SPI(Service Provider Interface)
 * Cache接口的实现类必须有一个具有String类型参数的构造方法,该参数作为实现类对象的id,对其进行唯一标识
 */
public class MybatisRedisCache implements Cache {

	private String id;

	public MybatisRedisCache(String id) {
		this.id = id;
	}

	/**
	 * 清空缓存
	 */
	@Override
	public void clear() {
		JedisUtils.clear();
	}

	/**
	 * 获取缓存对象的唯一标识
	 */
	@Override
	public String getId() {
		return this.id;
	}

	/**
	 * 从缓存对象中获取key对应的value
	 */
	@Override
	public Object getObject(Object key) {
		return JedisUtils.get(key);
	}

	/**
	 * 获取读写锁 可选的方法,从3.2.6起这个方法不再被框架核心调用 任何需要的锁,都必须由缓存供应商提供
	 */
	@Override
	public ReadWriteLock getReadWriteLock() {

		return null;
	}

	/**
	 * 获取缓存对象中存储的键/值对的数量 可选的方法,没有被框架核心调用
	 */
	@Override
	public int getSize() {
		return JedisUtils.getSize();
	}

	/**
	 * 保存key/value到缓存对象中 key可以是任何对象
	 */
	@Override
	public void putObject(Object key, Object value) {
		JedisUtils.set(key, value);
	}

	/**
	 * 可选的方法,没有被核心框架调用,移除key对应的value
	 */
	@Override
	public Object removeObject(Object key) {

		return null;
	}

	/**
	 * 重新equals方法
	 */
	@Override
	public boolean equals(Object o) {
		if (getId() == null)
			throw new CacheException("Cache instances require an ID.");
		if (this == o)
			return true;
		if (!(o instanceof Cache))
			return false;

		Cache otherCache = (Cache) o;
		return getId().equals(otherCache.getId());
	}

	/**
	 * 重新hashCode方法
	 */
	@Override
	public int hashCode() {
		if (getId() == null)
			throw new CacheException("Cache instances require an ID.");
		return getId().hashCode();
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。有什么问题可以邮箱联系我qgeniu@foxmail.com https://blog.csdn.net/WoddenFish/article/details/79975819

Mybatis快速入门

-
  • 1970年01月01日 08:00

使用Redis做MyBatis的二级缓存

转载地址:  http://www.cnblogs.com/springlight/p/6374372.html 1. 介绍   使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验...
  • qiuyinthree
  • qiuyinthree
  • 2017-03-07 20:28:30
  • 1990

redis作为mybatis的二级缓存,此时二级缓存可以作为高并发缓存吗

处理并发问题的重点不在于你的设计是怎样的 而在于你要评估你的并发,并在并发范围内处理。 你预估你的并发是多少,然后测试r+m是否支持。 还有要纠正你下,缓存的目的是为了应对普通对象数据库的读写限...
  • Fighting_YY
  • Fighting_YY
  • 2017-08-30 14:32:56
  • 329

Redis实现Mybatis的二级缓存

一、Mybatis的缓存 通大多数ORM层框架一样,Mybatis自然也提供了对一级缓存和二级缓存的支持。一下是一级缓存和二级缓存的作用于和定义。       1、一级缓存是SqlSession...
  • fengshizty
  • fengshizty
  • 2016-01-25 17:56:42
  • 11149

使用Redis做Mybatis二级缓存

一、常见的服务器缓存技术 1、memcached 2、redis 二、NOSql 概念:(not only sql) 不仅仅是关系型数据库结构  分类: 1、key-value redis缓存...
  • qq_35325795
  • qq_35325795
  • 2017-10-11 11:50:51
  • 245

mybatis+redis+mybatis-redis实现二级缓存

说明: 1、MyBatis默认开启二级缓存 2、MyBatis默认实现了自己的二级缓存(PerpetualCache),内部使用HashMap实现,无法实现分布式,并且服务器重启后就没有缓存了。 ...
  • a327919006
  • a327919006
  • 2017-10-19 09:57:39
  • 892

SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

项目环境: 在SpringMVC + MyBatis + Mysql。Redis部署在Linux虚拟机。1、整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...
  • xiadi934
  • xiadi934
  • 2016-03-03 10:37:47
  • 38440

SpringBoot+Mybatis项目使用Redis做Mybatis的二级缓存

SpringBoot+Mybatis项目使用redis做Mybatis的二级缓存1.在pom.xml文件中引入redis依赖 org.springframework.boot ...
  • qq_38158631
  • qq_38158631
  • 2017-12-05 16:27:46
  • 325

Spring Boot + Mybatis + 二级缓存实例(Ehcache,Redis)

使用Mybatis自带二级缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。 ...
  • xiaolyuh123
  • xiaolyuh123
  • 2017-06-27 10:45:38
  • 1462

分布式系统架构——使用Redis做MyBatis的二级缓存

使用Redis做MyBatis的二级缓存  通常为了减轻数据库的压力,我们会引入缓存。在Dao查询数据库之前,先去缓存中找是否有要找的数据,如果有则用缓存中的数据即可,就不用查询数据库了。如果没有...
  • qq_25689397
  • qq_25689397
  • 2016-07-29 16:23:15
  • 7920
收藏助手
不良信息举报
您举报文章:使用redis做mybatis的二级缓存
举报原因:
原因补充:

(最多只允许输入30个字)