缓存代码
import com.example.mybatisplus.config.SpringUtils;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisServerCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class RedisCache implements Cache {
private RedisTemplate<String,Object> redisTemplate;
private final ReadWriteLock lock = new ReentrantReadWriteLock(true);
private final String id;
public RedisCache(final String id) {
this.id = id;
}
private void ensure() {
if (redisTemplate == null) {
redisTemplate = SpringUtils.getBean("redisTemplate", RedisTemplate.class);
}
}
@Override
public String getId() {
return id;
}
@Override
public void putObject(Object o, Object o1) {
ensure();
redisTemplate.boundValueOps(o.toString()).set(o1);
}
@Override
public Object getObject(Object o) {
ensure();
return redisTemplate.boundValueOps(o.toString()).get();
}
@Override
public Object removeObject(Object o) {
ensure();
Object o1 = redisTemplate.boundValueOps(o.toString()).get();
redisTemplate.delete(o.toString());
return o1;
}
@Override
public void clear() {
ensure();
Set<String> keys = redisTemplate.keys("*");
assert keys != null;
keys.forEach(val -> {
redisTemplate.delete(val);
});
}
@Override
public int getSize() {
ensure();
Long size = redisTemplate.execute((RedisCallback<Long>) RedisServerCommands::dbSize);
assert size != null;
return size.intValue();
}
@Override
public ReadWriteLock getReadWriteLock() {
return lock;
}
}
Spring容器工具类
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.context = applicationContext;
}
public static Object getBean(String name){
return context.getBean(name);
}
public static <T> T getBean(String name, Class<T> clazz){
return context.getBean(name, clazz);
}
public static <T> T getBean(Class<T> clazz){
return context.getBean(clazz);
}
}
mapper接口加注解
@CacheNamespace(implementation = RedisCache.class,eviction = RedisCache.class)
配置
mybatis-plus.mapper-locations=classpath:mappers/*.xml
mybatis-plus.configuration.cache-enabled=true
spring.redis.host=192.168.0.160
spring.redis.database=0
spring.redis.port=6379