Mybatis二级缓存整合Redis

######mybatis自带二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存。在几个不同的服务器之间,我们需要使用第三方缓存框架,将缓存都放在这个第三方框架中, 然后无论有多少台服务器,我们都能从缓存中获取数据。 ######mybatis提供了一个eache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。 这里我们介绍mybatis与redis的整合。 mybatis提供了一个针对cache接口的redis实现类,该类存在mybatis-redis包中

实现

  1. pom.xml
<dependency> 
	<groupId>org.mybatis.caches</groupId> 
	<artifactId>mybatis-redis</artifactId> 
	<version>1.0.0-beta2</version> 
</dependency>
  1. 配置文件
  • 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
  1. 测试代码:
    @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);
    }
  1. 查看sql日志

源码分析

RedisCache和Mybatis的二级缓存方案大同小异,无非是实现Cache接口,并使用jedis操作缓存;不过该项目在设计细节上有一些区别
  1. 根据传递的参数创建Cache实现类
  2. 调用RedisCache构造函数 public RedisCache(String id),使用RedisConfigurationBuilder创建RedisConfig类,并使用RedisConfig创建JedisPool
  3. 创建RedisConfig时调用的配置文件为redis.properties
  4. 查看Cache中最重要的两个方法
可以很清楚的看到,mybatis-redis在存储数据的时候,是使用的hash结构,把cache的id作为这个hash的key (cache的id在mybatis中就是mapper的namespace);这个mapper中的查询缓存数据作为 hash的field,需要缓存的内容直接使用SerializeUtil存储,SerializeUtil和其他的序列化类差不多,负责 对象的序列化和反序列化