在网上看了很多资料,发现例子都是千篇一律的相互复制。而且,使用的都是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实现二级缓存的更多相关文章

  1. Spring + MySQL + Mybatis + Redis【二级缓存】

    一.Redis环境 Redis 官网 :http://redis.io/ windows下载:https://github.com/dmajkic/redis/downloads 1.文件解压缩 2. ...

  2. Springboot Mybatis Redis 实现二级缓存

    前言 什么是mybatis二级缓存? 二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace. 即,在不同的sqlsession中,相同的namespace下,相同 ...

  3. Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析

    一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就 ...

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

    2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...

  5. mybatis plus使用redis作为二级缓存

    建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...

  6. mybatis 使用redis实现二级缓存(spring boot)

    mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...

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

    转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...

  8. Mybatis的二级缓存、使用Redis做二级缓存

    目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...

  9. redis实现二级缓存

    缓存的作用就是降低数据库的使用率,来减轻数据库的负担.我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担.Mybatis也会做缓存,也会有一级缓存和二级缓 ...

随机推荐

  1. [转帖]Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍 https://cloud.tencent.com/developer/news/391063 原来 greenplum 也是基于pg研发的. ...

  2. hadoop--Unable to load native-hadoop library for your platform解决方法

    笔者实验环境:centos 7.4.1708,hadoop-2.6.0-cdh5.14.2. 执行hadoop命令时出现以下告警,不能加载相关库: WARN util.NativeCodeLoader ...

  3. Feign【token传递】

    使用feign调用服务的时候,存在一个问题,比如当前服务调用A服务,在请求头中包含了某些特殊的字段信息,比如当前操作人的token信息,调用A的时候可以正常拿到token,然而在去调用B服务的时候,可 ...

  4. java中不常见的关键字:strictfp

    1.strictfp, 即 strict float point (精确浮点). strictfp 关键字可应用于类.接口或方法.使用 strictfp 关键字声明一个方法时,该方法中所有的float ...

  5. Ubuntu16.04 换源(或者404 Not Found问题)

    当执行sudo apt-get update或者sudo apt-get install命令时,出现以下两个问题: “apt-get 404 Not Found Package Repository ...

  6. Activate注解

    Activate注解 被该注解修饰的接口,扩展类可能会被加载 ProtocolFilterWrapper.buildInvokerChain @Documented @Retention(Retent ...

  7. SCALA基础知识学习

    注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...

  8. 谷歌浏览器添加插件时显示程序包无效:"CRX_HEADER_INVALID" 解决办法

    今天在添加谷歌插件的时候,却发现谷歌浏览器显示 程序包无效:"CRX_HEADER_INVALID",现整理解决方法如下: 下图是下载好的 .crx 结尾的插件. 将插件的后缀名改 ...

  9. 怎样理解this

    JavaScript里的this, Python里的self, 其实都是一个东西, 它的存在跟构造函数 / 类这种是分不开的, 当然, 也可以在其他场合下使用, 他的意义很多, 但最共通的一个特点是: ...

  10. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...