本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

由于 MyBatis 本身的 Cache 实现都是基于本地的,在分布式场景下必然会出现 Cache 脏读,所以。
MyBatis 的二级缓存可以通过实现 Cache 接口来自定义,MyBatis 官方已经提供了一个 Redis 的实现:

1) 依赖

compile 'org.mybatis.caches:mybatis-redis:1.0.0-beta2'

2) 配置

2.1) Mapper 配置

首先是 mapper 的配置

<cache type="org.mybatis.caches.redis.RedisCache"/>

@CacheNamespace(implementation = RedisCache.class)

2.2) Redis 配置

入口为 RedisCache 的构造方法

public RedisCache(final String id) {
  if (id == null) {
    throw new IllegalArgumentException("Cache instances require an ID");
  }
  this.id = id;
  RedisConfig redisConfig = RedisConfigurationBuilder.getInstance().parseConfiguration();
  pool = new JedisPool(redisConfig, redisConfig.getHost(), redisConfig.getPort(),
        redisConfig.getConnectionTimeout(), redisConfig.getSoTimeout(), redisConfig.getPassword(),
        redisConfig.getDatabase(), redisConfig.getClientName());
}

从源码 RedisConfigurationBuilder 中得知,MyBatis-Redis 默认会读取 redis.properties 配置文件
,或在项目启动时 -Dredis.properties.filename=xxx.prop" 指定配置文件名来加载 Redis 的配置。

private static final String SYSTEM_PROPERTY_REDIS_PROPERTIES_FILENAME = "redis.properties.filename";
private static final String REDIS_RESOURCE = "redis.properties";

private RedisConfigurationBuilder() {
    redisPropertiesFilename = System.getProperty(SYSTEM_PROPERTY_REDIS_PROPERTIES_FILENAME, REDIS_RESOURCE);
}

有哪些参数可配置呢,可以从 RedisConfig 看到配置 key

private String host = Protocol.DEFAULT_HOST;
private int port = Protocol.DEFAULT_PORT;
private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
private int soTimeout = Protocol.DEFAULT_TIMEOUT;
private String password;
private int database = Protocol.DEFAULT_DATABASE;
private String clientName;

redis.properties

password=password

结束。