Mybatis二级缓存整合Redis
######mybatis自带二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存。在几个不同的服务器之间,我们需要使用第三方缓存框架,将缓存都放在这个第三方框架中, 然后无论有多少台服务器,我们都能从缓存中获取数据。 ######mybatis提供了一个eache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。 这里我们介绍mybatis与redis的整合。 mybatis提供了一个针对cache接口的redis实现类,该类存在mybatis-redis包中
实现
- pom.xml
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
- 配置文件
- Mapper.xml
<?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.example.mapper.UserMapper">
<!-- type 指定使用的缓存类 -->
<cache type="org.mybatis.caches.redis.RedisCache" />
</mapper>
- redis.properties
redis.host=localhost
redis.port=6379
redis.connectionTimeout=5000
redis.password=
redis.database=0
- 测试代码:
@Test
public void test5() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession1 = factory.openSession();
SqlSession sqlSession2 = factory.openSession();
User user1 = sqlSession1.selectOne("com.example.mapper.UserMapper.findById", 1);
System.out.println(user1);
sqlSession1.commit();
User user2 = sqlSession2.selectOne("com.example.mapper.UserMapper.findById", 1);
System.out.println(user2);
}
- 查看sql日志
源码分析
RedisCache和Mybatis的二级缓存方案大同小异,无非是实现Cache接口,并使用jedis操作缓存;不过该项目在设计细节上有一些区别
- 根据传递的参数创建Cache实现类
- 调用RedisCache构造函数 public RedisCache(String id),使用RedisConfigurationBuilder创建RedisConfig类,并使用RedisConfig创建JedisPool
- 创建RedisConfig时调用的配置文件为redis.properties
- 查看Cache中最重要的两个方法