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;}@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缓存相关推荐
- SpringMVC + MyBatis + MySQL + Redis(作为二级缓存) 配置
前言 Mybatis 有二级缓存,为什么还要用Redis? mybais一级缓存作用域是session,session commit之后缓存就失效了. mybais二级缓存作用域是sessionfac ...
- MySQL 与 Redis 缓存的同步方案
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
- MySQL与Redis缓存问题-开课吧
Redis是一个由C语言开发的数据库.为了避免使用MySQL要求过度影响性能,它将被使用.Mysql和redis数据在高并发场景中的一致性不容忽视. MySQL和Redis缓存的一致性. 场景:线程A ...
- 【免费使用】【redis】【数据库】快速使用redislabs免费套餐 注册和配置redis 缓存 数据库 nosql
[免费]快速使用redislabs免费套餐 注册和配置redis 缓存数据库 简介 视频教程 操作步骤 参考资料 结束の语 今日问答 YOUTUBE频道 欢迎订阅我的bilibili频道 [免费]快速 ...
- Java+SSM(Spring+SpringMVC+Mybatis)+Mysql个性化新闻推荐系统 基于用户、项目、内容、聚类、混合的协同过滤推荐算法WebNewsRSM 源代码下载
Java+SSM(Spring+SpringMVC+Mybatis)+Mysql个性化新闻推荐系统 基于用户.项目.内容.聚类.混合的协同过滤推荐算法WebNewsRSM 源代码下载 一.项目简介 1 ...
- SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)
博客目录 SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM框架(spring+springmv ...
- 基于SSM的家校通系统(Spring+SpringMVC+Mybatis+mysql)
这是一基于SSM框架开发的家校通. 源代码: 基于SSM的家校通系统(Spring+SpringMVC+Mybatis+mysql).zip-Java文档类资源-CSDN下载这是一基于SSM(spri ...
- MySQL与Redis缓存的同步的方案
本文介绍MySQL与Redis缓存的同步的两种方案 方案1:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现 方案2:解析MySQL的binlog实现,将数据库中的数据同步到Re ...
- java springmvc mybatis mysql
仅供参考 java springMvc mybatis mylsq 项目搭建 1.开发环境: window 64.jdk 1.7.0_51.eclipse.tomcat 7 2.jdk安装与环境变量配 ...
最新文章
- 计算机word表格居中,word表格居中怎么弄
- web程序部署常见(404)错误
- oracle获取当前日期的前一天,判断两个日期是否相等
- Linux下配置tomcat+apr+native应对高并发
- vue.js--基础事件定义,获取数据,执行方法传值
- 冒泡排序java jsp_冒泡排序实现原理
- 初识ObjectBox--Android平台
- java基类能调用虚函数_如果我要重写基类的虚函数,可以调用它吗?
- node定时任务php 卡,NodeJs实现定时任务的示例代码
- 区块链 自私挖矿(selfish mining)是什么
- 错误处理之异常与返回码
- 【Docker端口映射】
- Anaconda下载及详细安装图文教程(基于Windows操作系统)
- 对ASP.NET程序员非常有用的85个工具
- 学校毕业论文格式对奇数页页眉和偶数页页眉有要求,遇到问题请教
- 分布式事务中的时间戳详解
- oracle 基本语句
- POJ - Frogs' Neighborhood(Havel-Hakimi)
- 给定平面上任意三个点的坐标(x​1,y​1)、(x​2​​ ,y​2​​)、(x​3​​ ,y​3​​),检验它们能否构成三角形
- 自己动手丰衣足食之图片放大镜
热门文章
- 生成各种统计图的C#方法
- c/c++对象模型大总结:第5-8章、数据成员的存取与布局
- HDU 2087剪花布条 KMP
- python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
- 1.关于逆向工程(RE、RCE)-笔记
- hdu5014 构造b数列使得t最大(小想法)
- 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )
- 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
- 【错误记录】记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )