配置mybatis使用redis作为自定义缓存
mybatis自身的缓存做的并不完美,但它提供了使用自定义缓存的机会,我们可以选择使用我们喜欢的自定义缓存,下面将介绍一下,使用redis作为mybatis的自定义缓存的具体步骤。
redis和mybatis的下载以及使用这里就不多介绍了(网上都可以学到)
1.首先,要想使用mybatis自定义缓存,就必须让自定义缓存类实现mybatis提供的Cache 接口(org.apache.ibatis.cache.Cache)
package org.apache.ibatis.cache;
import java.util.concurrent.locks.ReadWriteLock;
public interface Cache {
String getId();
void putObject(Object var1, Object var2);
Object getObject(Object var1);
Object removeObject(Object var1);
void clear();
int getSize();
ReadWriteLock getReadWriteLock();
}
我们要使用redis做自定义缓存,就应该完成这个自定义缓存类,但mybatis的git上提供了相对于的适配包,我们只需要下载即可,下面是适配包的maven依赖
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
我们可以查看RedisCache的源码:
package org.mybatis.caches.redis;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.ibatis.cache.Cache;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public final class RedisCache implements Cache {
private final ReadWriteLock readWriteLock = new DummyReadWriteLock();
private String id;
private static JedisPool pool;
public RedisCache(String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
} else {
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());
}
}
private Object execute(RedisCallback callback) {
Jedis jedis = pool.getResource();
Object var3;
try {
var3 = callback.doWithRedis(jedis);
} finally {
jedis.close();
}
return var3;
}
public String getId() {
return this.id;
}
public int getSize() {
return ((Integer)this.execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
Map<byte[], byte[]> result = jedis.hgetAll(RedisCache.this.id.toString().getBytes());
return result.size();
}
})).intValue();
}
public void putObject(final Object key, final Object value) {
this.execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
jedis.hset(RedisCache.this.id.toString().getBytes(), key.toString().getBytes(), SerializeUtil.serialize(value));
return null;
}
});
}
public Object getObject(final Object key) {
return this.execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
return SerializeUtil.unserialize(jedis.hget(RedisCache.this.id.toString().getBytes(), key.toString().getBytes()));
}
});
}
public Object removeObject(final Object key) {
return this.execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
return jedis.hdel(RedisCache.this.id.toString(), new String[]{key.toString()});
}
});
}
public void clear() {
this.execute(new RedisCallback() {
public Object doWithRedis(Jedis jedis) {
jedis.del(RedisCache.this.id.toString());
return null;
}
});
}
public ReadWriteLock getReadWriteLock() {
return this.readWriteLock;
}
public String toString() {
return "Redis {" + this.id + "}";
}
}
2.我们需要在mybatis的配置文件里手动设置缓存可用
<setting name="cacheEnabled" value="true"/>
3.在对应的mapper里设置我们想用的自定义缓存类
如果我们使用的是mapper.xml文件来配置对应的查询语句,那么在它的头部加上
<cache type="org.mybatis.caches.redis.RedisCache"/>
如果我们使用的是在**mapper.java对应的mapper方法上使用注解来设置对应的数据库查询语句,那就在mapper类上加上下面的代码
@CacheNamespace(implementation = org.mybatis.caches.redis.RedisCache.class)
ok,大功告成!