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;}@Overridepublic void clear() {redisClient.flushDB();}@Overridepublic String getId() {return this.id;}@Overridepublic Object getObject(Object key) {Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "    value=" + value);return value;}@Overridepublic ReadWriteLock getReadWriteLock() {return readWriteLock;}@Overridepublic int getSize() {return Integer.valueOf(redisClient.dbSize().toString());}@Overridepublic void putObject(Object key, Object value) {logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "    value=" + value);redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));}@Overridepublic 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

转载于:https://www.cnblogs.com/MoEee/p/6490573.html

SpringMVC+Mybatis+MySQL配置Redis缓存相关推荐

  1. SpringMVC + MyBatis + MySQL + Redis(作为二级缓存) 配置

    前言 Mybatis 有二级缓存,为什么还要用Redis? mybais一级缓存作用域是session,session commit之后缓存就失效了. mybais二级缓存作用域是sessionfac ...

  2. MySQL 与 Redis 缓存的同步方案

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  3. MySQL与Redis缓存问题-开课吧

    Redis是一个由C语言开发的数据库.为了避免使用MySQL要求过度影响性能,它将被使用.Mysql和redis数据在高并发场景中的一致性不容忽视. MySQL和Redis缓存的一致性. 场景:线程A ...

  4. 【免费使用】【redis】【数据库】快速使用redislabs免费套餐 注册和配置redis 缓存 数据库 nosql

    [免费]快速使用redislabs免费套餐 注册和配置redis 缓存数据库 简介 视频教程 操作步骤 参考资料 结束の语 今日问答 YOUTUBE频道 欢迎订阅我的bilibili频道 [免费]快速 ...

  5. Java+SSM(Spring+SpringMVC+Mybatis)+Mysql个性化新闻推荐系统 基于用户、项目、内容、聚类、混合的协同过滤推荐算法WebNewsRSM 源代码下载

    Java+SSM(Spring+SpringMVC+Mybatis)+Mysql个性化新闻推荐系统 基于用户.项目.内容.聚类.混合的协同过滤推荐算法WebNewsRSM 源代码下载 一.项目简介 1 ...

  6. SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)

    博客目录 SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM框架(spring+springmv ...

  7. 基于SSM的家校通系统(Spring+SpringMVC+Mybatis+mysql)

    这是一基于SSM框架开发的家校通. 源代码: 基于SSM的家校通系统(Spring+SpringMVC+Mybatis+mysql).zip-Java文档类资源-CSDN下载这是一基于SSM(spri ...

  8. MySQL与Redis缓存的同步的方案

    本文介绍MySQL与Redis缓存的同步的两种方案 方案1:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现 方案2:解析MySQL的binlog实现,将数据库中的数据同步到Re ...

  9. java springmvc mybatis mysql

    仅供参考 java springMvc mybatis mylsq 项目搭建 1.开发环境: window 64.jdk 1.7.0_51.eclipse.tomcat 7 2.jdk安装与环境变量配 ...

最新文章

  1. 计算机word表格居中,word表格居中怎么弄
  2. web程序部署常见(404)错误
  3. oracle获取当前日期的前一天,判断两个日期是否相等
  4. Linux下配置tomcat+apr+native应对高并发
  5. vue.js--基础事件定义,获取数据,执行方法传值
  6. 冒泡排序java jsp_冒泡排序实现原理
  7. 初识ObjectBox--Android平台
  8. java基类能调用虚函数_如果我要重写基类的虚函数,可以调用它吗?
  9. node定时任务php 卡,NodeJs实现定时任务的示例代码
  10. 区块链 自私挖矿(selfish mining)是什么
  11. 错误处理之异常与返回码
  12. 【Docker端口映射】
  13. Anaconda下载及详细安装图文教程(基于Windows操作系统)
  14. 对ASP.NET程序员非常有用的85个工具
  15. 学校毕业论文格式对奇数页页眉和偶数页页眉有要求,遇到问题请教
  16. 分布式事务中的时间戳详解
  17. oracle 基本语句
  18. POJ - Frogs' Neighborhood(Havel-Hakimi)
  19. 给定平面上任意三个点的坐标(x​1,y​1)、(x​2​​ ,y​2​​)、(x​3​​ ,y​3​​),检验它们能否构成三角形
  20. 自己动手丰衣足食之图片放大镜

热门文章

  1. 生成各种统计图的C#方法
  2. c/c++对象模型大总结:第5-8章、数据成员的存取与布局
  3. HDU 2087剪花布条 KMP
  4. python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
  5. 1.关于逆向工程(RE、RCE)-笔记
  6. hdu5014 构造b数列使得t最大(小想法)
  7. 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )
  8. 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
  9. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
  10. 【错误记录】记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )