1,实现org.apache.ibatis.cache.Cache接口即可,代码示例:
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Set;
/**
* 使用redis做mybatis二级缓存
*
* @author hmh
*/
@Slf4j
@ToString // 需要重写id的toString方法、否则报错
@EqualsAndHashCode
public class RedisCacheConfiguration implements Cache {
private final String id;
public RedisCacheConfiguration(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public void putObject(Object o, Object o1) {
log.info("缓存[put]key:{}, value:{}", o, o1);
getRedisTemplate().opsForValue().set(o.toString(), o1);
}
@Override
public Object getObject(Object o) {
log.info("缓存[get]key:{}", o);
return getRedisTemplate().opsForValue().get(o.toString());
}
@Override
public Object removeObject(Object o) {
log.info("缓存[del]key:{}", o);
return getRedisTemplate().delete(o.toString());
}
@Override
public void clear() {
Set<String> keys = getRedisTemplate().keys("*" + id + "*");
System.out.println("清空缓存keys:" + keys);
assert keys != null;
getRedisTemplate().delete(keys);
}
@Override
public int getSize() {
Set<String> keys = getRedisTemplate().keys("*" + id + "*");
assert keys != null;
return keys.size();
}
private RedisTemplate<String, Object> getRedisTemplate() {
return SpringUtil.getBean("redisTemplate");
}
}
注意:当数据库id不是String类型时必须重写ToString方法,否则会报错