在Mapper文件中,指定命名空间下的缓存实现方式
<!-- 开启本mapper namespace下的二级缓存 -->
<cache type="com.corecmd.webapp.tiansjportal.common.utils.MyBatisRedisCache"/>
缓存实现类:
package com.corecmd.webapp.tiansjportal.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author CoreCmd
* @date 2021/7/5
* @apiNote
*/
@Slf4j
public class MyBatisRedisCache implements Cache {
private String id;
private RedisTemplate<Object,Object> redisTemplate;
private String mybatisCachePrefix = "tiansjportal-mybatis-cache";
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public MyBatisRedisCache(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public void putObject(Object key, Object value) {
redisTemplate = getRedisTemplate();
ValueOperations<Object,Object> opsForValue = redisTemplate.opsForValue();
opsForValue.set(mybatisCachePrefix + key.toString(), value, 30, TimeUnit.MINUTES);
}
private RedisTemplate<Object, Object> getRedisTemplate(){
if (redisTemplate == null) {
redisTemplate = ApplicationContextHolder.getBean("redisTemplate");
}
//序列化为String,为后续操作统一前缀的缓存准备
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
return redisTemplate;
}
@Override
public Object getObject(Object key) {
redisTemplate = getRedisTemplate();
ValueOperations<Object,Object> opsForValue = redisTemplate.opsForValue();
return opsForValue.get(mybatisCachePrefix + key.toString());
}
@Override
public Object removeObject(Object key) {
redisTemplate = getRedisTemplate();
redisTemplate.delete(mybatisCachePrefix + key.toString());
return null;
}
@Override
public void clear() {
// 删除所有的mybatis的缓存key
Set<Object> keys = redisTemplate.keys(mybatisCachePrefix + "*");
redisTemplate.delete(keys);
}
@Override
public int getSize() {
// 获取所有的mybatis的缓存key
Set<Object> keys = redisTemplate.keys(mybatisCachePrefix + "*");
return keys!= null ? keys.size():0;
}
}