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

2019-06-08 08:33发布

  • 1、整体思路
  • 2、pom.xml中加入Maven依赖
  • 3、引入applicationContext.xml中引入redis配置
  • 4、创建缓存实现类RedisCache
  • 5、创建中间类RedisCacheTransfer,完成RedisCache.jedisConnectionFactory的静态注入
  • 6、配置文件redis.properties
  • 7、mapper中加入MyBatis二级缓存
  • 8、Mybatis全局配置
  • 9、打印Sql日志,方便测试
  • 10、测试代码

项目环境:在SpringMVC + MyBatis + Mysql。Redis部署在Linux虚拟机。

1、整体思路

  1. 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅)
  2. 使用Spring管理Redis连接池
  3. 模仿EhcacheCache,实现RedisCache

2、pom.xml中加入Maven依赖



org.springframework.data
spring-data-redis
1.6.2.RELEASE



redis.clients
jedis
2.8.0



org.mybatis
mybatis-ehcache
1.0.0

3、引入applicationContext.xml中引入redis配置





classpath:jdbc.properties
classpath:redis.properties











p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>




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 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 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 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二级缓存



.....

8、Mybatis全局配置


PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

































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 page1 = service.querySite("", 1, 2, "", "");
logger.info(page1.getList().get(1).getName());
PageInfo page2 = service.querySite("", 2, 2, "", "");
logger.info(page2.getList().get(0).getName());
PageInfo page3 = service.querySite("", 1, 2, "", "");
logger.info(page3.getList().get(0).getName());
}
}

首次运行结果

img

后续运行结果

img

同条件的查询语句可以发现,已经不再查询Mysql,而是直接取Redis数据

查看Redis数据库 keys *, 会发现多了很多数据,结果如下

img

至此,Redis基本配置成功。

来源:http://t.cn/EamaPh2


搜索微信号(ID:芋道源码),可以获得各种 Java 源码解析。

并且,回复【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的书籍。

来吧,骚年~

文章来源: https://www.toutiao.com/group/6686350699279680011/