mybatis+redis实现二级缓存
在网上看了很多资料,发现例子都是千篇一律的相互复制。而且,使用的都是jedis的客户端。。我这里使用的是redistemplate类实现。
缓存的原理。。实现cache类接口,当哪个类需要缓存的时候,就直接将cache标签引入,并且制定我们的缓存类就可以了。
上代码:
1、引入spring-data-redis
<!-- redis服务 start-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.2.RELEASE</version>
</dependency>
2、java缓存类,至于里面如何获取bean,ApplicationUtil.getBean("redisTemplate"),请查看我上篇文章:普通java类获取springbean的方法
package com.iafclub.demo.cache; import java.io.Serializable;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.ibatis.cache.Cache;
import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import com.iafclub.demo.util.ApplicationUtil; /**
* 使用第三方缓存服务器,处理二级缓存
* 缓存时间在putObject中设置
*
* @author chenweixian
*
*/
public class RedisCache implements Cache {
private static final Logger logger = Logger.getLogger(RedisCache.class); private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); private final String COMMON_CACHE_KEY = "demo:MYBATIS:"; private String id; private JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer();
/**所有key*/
private String getKeys() {
return COMMON_CACHE_KEY + this.id + ":*";
}
/**
* 按照一定规则标识key
*/
private String getKey(Object key) {
return COMMON_CACHE_KEY + this.id + ":"+DigestUtils.md5Hex(String.valueOf(key));
} public RedisTemplate<String, Serializable> getRedisTemplate(){
return (RedisTemplate<String, Serializable>) ApplicationUtil.getBean("redisTemplate");
} public RedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("必须传入ID");
}
logger.debug("MybatisRedisCache:id=" + id);
this.id = id;
} @Override
public String getId() {
return this.id;
} @Override
public void putObject(Object key, Object value) {
if (getRedisTemplate()==null){
return ;
}
if (value != null) {
getRedisTemplate().opsForValue().set(getKey(key),
jdkSerializer.serialize(value), 20, TimeUnit.SECONDS);
}
} @Override
public Object getObject(Object key) {
if (getRedisTemplate()==null){
return null;
}
try {
if (key != null) {
Object obj = getRedisTemplate().opsForValue().get(getKey(key));
return jdkSerializer.deserialize((byte[]) obj);
}
} catch (Exception e) {
logger.error("redis ");
}
return null;
} @Override
public Object removeObject(Object key) {
if (getRedisTemplate()==null){
return null;
}
try {
if (key != null) {
getRedisTemplate().delete(getKey(key));
logger.debug("从缓存中移除-----"+this.id);
}
} catch (Exception e) {
}
return null;
} @Override
public void clear() {
if (getRedisTemplate()==null){
return ;
}
try {
Set<String> keys = getRedisTemplate().keys(getKeys());
getRedisTemplate().delete(keys);
logger.debug("出现新增、修改、删除操作,清空对应Mapper缓存======>"+keys.size());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
} @Override
public int getSize() {
if (getRedisTemplate()==null){
return 0;
}
Long size = getRedisTemplate().execute(
new RedisCallback<Long>() {
@Override
public Long doInRedis(RedisConnection connection)
throws DataAccessException {
return connection.dbSize();
}
});
return size.intValue();
} @Override
public ReadWriteLock getReadWriteLock() {
return this.readWriteLock;
}
}
3、mybatis配置:注意加粗标红,斜线部分:
21 <!-- redis缓存 -->
22 <cache type="com.iafclub.demo.cache.RedisCache" eviction="LRU" />
<?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.iafclub.demo.dao.DictionaryMapper" >
<resultMap id="BaseResultMap" type="com.iafclub.demo.domain.Dictionary" >
<id column="auto_id" property="autoId" jdbcType="VARCHAR" />
<result column="type_id" property="typeId" jdbcType="VARCHAR" />
<result column="type_name" property="typeName" jdbcType="VARCHAR" />
<result column="field_key" property="fieldKey" jdbcType="VARCHAR" />
<result column="field_value" property="fieldValue" jdbcType="VARCHAR" />
<result column="field_back" property="fieldBack" jdbcType="VARCHAR" />
<result column="field_back2" property="fieldBack2" jdbcType="VARCHAR" />
<result column="field_back3" property="fieldBack3" jdbcType="VARCHAR" />
<result column="remark" property="remark" jdbcType="VARCHAR" />
<result column="editor" property="editor" jdbcType="VARCHAR" />
<result column="edittime" property="edittime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
auto_id, type_id, type_name, field_key, field_value, field_back, field_back2, field_back3,
remark, editor, edittime
</sql>
21 <!-- redis缓存 -->
22 <cache type="com.iafclub.demo.cache.RedisCache" eviction="LRU" />
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
<include refid="Base_Column_List" />
from t_dictionary
where auto_id = #{autoId}
</select>
<select id="selectAll" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
<include refid="Base_Column_List" />
from t_dictionary limit 200
</select>
</mapper>
4、mybatis配置:
<?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"/>
<!-- Java属性与数据库字段采用驼峰式对应 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<!--
<settings>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="cacheEnabled" value="true" /> 这个配置使全局的映射器启用或禁用缓存
<setting name="multipleResultSetsEnabled" value="true"/>对于未知的SQL查询,允许返回不同的结果集以达到通用的效果
<setting name="defaultExecutorType" value="REUSE" />配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新
<setting name="lazyLoadingEnabled" value="false" />全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载
<setting name="aggressiveLazyLoading" value="true" />
<setting name="enhancementEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="25000" /> 设置超时时间,它决定驱动等待一个数据库响应的时间。
</settings>
-->
</configuration>
5、其他页面实现,次要。。。
n、测试运行结果:只有第一次查询,发送了sql,第二次后,就不会发送sql,直接在redis中查询。如果进行增删改,都会清空,然后,再发sql


mybatis+redis实现二级缓存的更多相关文章
- Spring + MySQL + Mybatis + Redis【二级缓存】
一.Redis环境 Redis 官网 :http://redis.io/ windows下载:https://github.com/dmajkic/redis/downloads 1.文件解压缩 2. ...
- Springboot Mybatis Redis 实现二级缓存
前言 什么是mybatis二级缓存? 二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace. 即,在不同的sqlsession中,相同的namespace下,相同 ...
- Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析
一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就 ...
- SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...
- mybatis plus使用redis作为二级缓存
建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...
- mybatis 使用redis实现二级缓存(spring boot)
mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...
- SpringMVC +Spring + MyBatis + Mysql + Redis(作为二级缓存) 配置
转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...
- Mybatis的二级缓存、使用Redis做二级缓存
目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...
- redis实现二级缓存
缓存的作用就是降低数据库的使用率,来减轻数据库的负担.我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担.Mybatis也会做缓存,也会有一级缓存和二级缓 ...
随机推荐
- [转帖]阿里的JDK预热warmup过程
预热warmup过程 https://blog.csdn.net/wabiaozia/article/details/82056520 Jwarmup 原理是记录上一次运行时已经变成native co ...
- @ConfigurationProperties和@Value的区别
@ConfigurationProperties @Value 功能: 批量注入配置文件中的属性 一个个指定,多个属性多个@Value 松散绑定: 支持 不支持 SpEL: 不支持 支持 JSR ...
- Java 语言 ArrayList 和 JSONArray 相互转换
Java 语言 ArrayList 和 JSONArray 相互转换 本篇主要讲解 ArrayList 和 fastjson 中的 JSONArray相互转换的几种常用方式,以实体类 Student. ...
- Centos7.x 安装libevent2.x
1.在http://libevent.org/下载libevent-2.1.8-stable.tar.gz 2.tar -zxvf libevent-2.1.8-stable.tar.gz 3.cd ...
- 排查java 内存CPU报警
#!/bin/bash source /etc/profile #接收外部传入PID,任选一种 #servicePid=$1 headPid=`ps auxw|sort -rn -k3|head -4 ...
- 十一、三星平台framebuffer驱动
和总线设备驱动模型类似,framebuffer分为核心层.驱动层和设备层. 核心层:就是上一章分析的fbmem.c文件 驱动层(控制器层):一般由芯片原厂提供,实现了LCD控制器通用的操作接口和配置接 ...
- 使用Python比较MySQL数据库中两个数据库的表结构--转载
https://blog.csdn.net/tenaguan4461/article/details/82286781 https://www.jianshu.com/p/b3dac5a3479a
- RHadoop: REDUCE capability required is more than the supported max container capability in the cluster
I have not used RHadoop. However I've had a very similar problem on my cluster, and this problem see ...
- Dubbo#编译动态扩展类
这篇排版有问题 后面修改....**** 以ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();为例 - ...
- SAS学习笔记34 指针控制
指针控制符分为行指针和列指针两种 列指针控制符模式 @n:指明列的开始位置,是对应变量的数据开始列位置 列控制符号模式 n1-n2:n1列开始位置,n2列结束位置 @与@@符号应用 @行控制符号,控制 ...