项目环境: 在SpringMVC + MyBatis + Mysql。Redis部署在Linux虚拟机。
1、整体思路
- 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅)
- 使用Spring管理Redis连接池
- 模仿EhcacheCache,实现RedisCache
2、pom.xml中加入Maven依赖
<!-- spring-redis实现 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.2.RELEASE</version> </dependency> <!-- redis客户端jar --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency> <!-- Ehcache实现,用于参考 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version> </dependency>
3、引入applicationContext.xml中引入redis配置
<!-- 引入数据库配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:redis.properties</value> </list> </property> </bean> <!-- redis数据源 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxTotal" value="${redis.maxActive}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- Spring-redis连接池管理工厂 --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 --> <bean id="redisCacheTransfer" class="com.strive.cms.cache.RedisCacheTransfer"> <property name="jedisConnectionFactory" ref="jedisConnectionFactory"/> </bean>
4、创建缓存实现类RedisCache
/** * * @描述: 使用第三方内存数据库Redis作为二级缓存 * @版权: Copyright (c) 2016 * @作者: xiad * @版本: 1.0 * @创建日期: 2016年3月2日 * @创建时间: 下午8:02:57 */ public class RedisCache implements Cache { private static final Logger logger = LoggerFactory.getLogger(RedisCache.class); private static JedisConnectionFactory jedisConnectionFactory; private final String id; /** * The {@code ReadWriteLock}. */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } logger.debug("MybatisRedisCache:id=" + id); this.id = id; } @Override public void clear() { JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); connection.flushDb(); connection.flushAll(); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } } @Override public String getId() { return this.id; } @Override public Object getObject(Object key) { Object result = null; JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result = serializer.deserialize(connection.get(serializer.serialize(key))); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } @Override public int getSize() { int result = 0; JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); result = Integer.valueOf(connection.dbSize().toString()); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } @Override public void putObject(Object key, Object value) { JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); connection.set(serializer.serialize(key), serializer.serialize(value)); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } } @Override public Object removeObject(Object key) { JedisConnection connection = null; Object result = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result =connection.expire(serializer.serialize(key), 0); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) { RedisCache.jedisConnectionFactory = jedisConnectionFactory; } }
5、创建中间类RedisCacheTransfer,完成RedisCache.jedisConnectionFactory的静态注入
/** * * @描述: 静态注入中间类 * @版权: Copyright (c) 2016 * @作者: xiad * @版本: 1.0 * @创建日期: 2016年3月2日 * @创建时间: 下午8:02:57 */ public class RedisCacheTransfer { @Autowired public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) { RedisCache.setJedisConnectionFactory(jedisConnectionFactory); } }
6、配置文件redis.properties
# Redis settings redis.host=192.168.25.132 redis.port=6379 redis.pass= redis.maxIdle=300 redis.maxActive=600 redis.maxWait=1000 redis.testOnBorrow=true
7、mapper中加入MyBatis二级缓存
<mapper namespace="com.strive.cms.dao.site.CatalogMapper" > <cache type="com.strive.cms.cache.RedisCache"/> ..... </mapper>
8、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> <!-- 配置mybatis的缓存,延迟加载等等一系列属性 --> <settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 查询时,关闭关联对象即时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="false"/> <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 允许使用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="false"/> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 FULL,PARTIAL --> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- 对于批量更新操作缓存SQL以提高性能 BATCH,SIMPLE --> <!-- <setting name="defaultExecutorType" value="BATCH" /> --> <!-- 数据库超过25000秒仍未响应则超时 --> <!-- <setting name="defaultStatementTimeout" value="25000" /> --> <!-- Allows using RowBounds on nested statements --> <setting name="safeRowBoundsEnabled" value="false"/> <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. --> <setting name="localCacheScope" value="SESSION"/> <!-- Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. --> <setting name="jdbcTypeForNull" value="OTHER"/> <!-- Specifies which Object's methods trigger a lazy load --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="true"/> </settings> </configuration>
9、打印Sql日志,方便测试
#定义LOG输出级别为INFO log4j.rootLogger=INFO,Console,File ####定义日志输出目的地为控制台 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.out #可以灵活地指定日志输出格式,下面一行是指定具体的格式 log4j.appender.Console.layout = org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n ####文件大小到达指定尺寸的时候产生一个新的文件 log4j.appender.File = org.apache.log4j.RollingFileAppender #指定输出目录 log4j.appender.File.File = logs/ssm.log #定义文件最大大小 log4j.appender.File.MaxFileSize = 10MB #输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志 log4j.appender.File.Threshold = ALL log4j.appender.File.layout = org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n ####显示本项目SQL语句部分 log4j.logger.com.strive.cms=DEBUG
10、测试代码
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class MyBatisCacheSecondTest { private static final Logger logger = LoggerFactory.getLogger(MyBatisCacheSecondTest.class); @Autowired private SiteService service; /* * 二级缓存测试 */ @Test public void testCache2() { PageInfo<Site> page1 = service.querySite("", 1, 2, "", ""); logger.info(page1.getList().get(1).getName()); PageInfo<Site> page2 = service.querySite("", 2, 2, "", ""); logger.info(page2.getList().get(0).getName()); PageInfo<Site> page3 = service.querySite("", 1, 2, "", ""); logger.info(page3.getList().get(0).getName()); } }
首次运行结果
后续运行结果
同条件的查询语句可以发现,已经不再查询Mysql,而是直接取Redis数据
查看Redis数据库 keys *, 会发现多了很多数据,结果如下
至此,Redis基本配置成功。
如有疑问或建议,欢迎留言与指点
转发地址:http://blog.csdn.net/xiadi934/article/details/50786293
相关推荐
该项目是一个基于Spring、SpringMVC、Mybatis、MySQL、Redis和Maven的综合应用实例,旨在为初学者提供一个清晰易懂的学习平台。下面将详细解释这些技术组件及其在项目中的作用。 **Spring框架**: Spring是Java企业...
在这个系统中,SpringMVC作为前端控制器处理HTTP请求,Dubbo用于服务治理,MyBatis是持久层框架,MySQL是关系型数据库,而Redis则用作缓存服务。接下来,我们将详细探讨这些组件以及如何在本地环境中配置和运行。 *...
本项目以“maven+springmvc+redis+mybatis整合”为主题,旨在提供一个基于这些技术的集成框架,特别强调了利用Redis作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...
本示例提供了一个使用Maven集成Spring、SpringMVC、MyBatis、Redis和MySQL的综合学生查询系统。下面将详细阐述这些技术栈的核心概念及其整合过程。 首先,Maven是Java项目管理工具,它帮助开发者管理依赖关系,构建...
本源码《Shiro整合springMvc+Mybatis+Redis》包括shiro的基本认证、授权、加密、会话管理(SessionManager)、缓存管理(CacheManager),结合redis,数据库连接Mysql为mybatis(包含数据库sql脚本),运行环境为JDK8
Spring和SpringMVC的结合提供了一个灵活的控制层,Mybatis则处理数据访问,MySQL作为可靠的数据存储,Redis提供高速缓存,而Maven确保了项目的构建和依赖管理。这样的架构是现代Java Web应用的典型模式,既适合初学...
【标题】"java贷款项目spring+springMVC+mybatis+redis+mysql"是一个基于Java技术栈开发的贷款管理系统,其核心技术选用了经典的SSM(Spring、SpringMVC、Mybatis)架构,并辅以Redis缓存和MySQL数据库,旨在提供...
- **缓存**: Redis(高性能的key-value存储系统)、ehcache(Java平台上的缓存实现)。 - **消息中间件**: ActiveMQ(基于AMQP协议的消息中间件)。 - **负载均衡**: Nginx(高效反向代理服务器)。 - **分布式...
《基于Spring+SpringMVC+MyBatis的酒店管理系统与MySQL数据库集成详解》 酒店管理系统是信息化时代提高酒店运营效率的重要工具,它涵盖了预订、入住、退房、账务管理等多个业务环节。本系统采用Spring、SpringMVC和...
再者,MyBatis是一个轻量级的持久层框架,它将SQL语句与Java代码解耦,通过XML或注解的方式配置映射,实现了数据访问的便利性。在本系统中,MyBatis作为数据库操作的接口,允许开发者直接编写SQL,从而提高了查询...
《构建Flutter微博客户端后台系统:基于Spring+SpringMVC+Mybatis+Maven+MySQL的实践详解》 在移动应用开发领域,Flutter以其高效的性能、丰富的UI组件库以及跨平台特性,深受开发者喜爱。然而,一个完整的应用不仅...
【标题】"spring,mybatis,hibernate,activemq,redis,dubbo的集成" 这个标题提及的是一个综合性的Java开发项目,它整合了多个流行的技术框架和中间件,旨在提供一个全面的后端服务解决方案。让我们逐一探讨这些...
这种服务能够快速响应数据请求,通过Redis缓存提高性能,同时利用Lombok简化代码,提高开发效率。项目的base_project可能包含了上述所有配置和实现,可以直接用于开发,只需要根据实际需求进行相应的调整即可。
**SpringBoot + SpringMVC + Mybatis 整合详解** SpringBoot、SpringMVC和Mybatis...在实际项目开发中,还可以考虑引入其他组件,如Redis缓存、Swagger API文档、Spring Security安全框架等,以实现更复杂的功能需求。
### MyBatis与Redis缓存配置详解 #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级...
在本项目中,我们主要探讨的是如何搭建一...这个简单的项目可以作为学习SSM的基础,随着需求的增加,可以逐步引入更多的功能和技术,如Spring Security进行权限管理,Hibernate Validator进行数据校验,Redis做缓存等。
SpringMvc+MyBatis+MySQL+Maven+Redis搭建一个基础的web项目-附件资源
:RESTful API + redis缓存 :前扩展分离+部署部署(springboot + vue) :dubbo服务化 :springcloud技术栈实现微服务化 特别提示:数据库sql脚本文件在resources / db目录下! 本项目为ssm系列的第一篇, ...