当前位置: 代码迷 >> 综合 >> Redis给Mybatis做缓存
  详细解决方案

Redis给Mybatis做缓存

热度:61   发布时间:2024-02-23 19:51:14.0

 缓存代码

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);}}@Overridepublic String getId() {return id;}@Overridepublic void putObject(Object o, Object o1) {ensure();redisTemplate.boundValueOps(o.toString()).set(o1);}@Overridepublic Object getObject(Object o) {ensure();return redisTemplate.boundValueOps(o.toString()).get();}@Overridepublic Object removeObject(Object o) {ensure();Object o1 = redisTemplate.boundValueOps(o.toString()).get();redisTemplate.delete(o.toString());return o1;}@Overridepublic void clear() {ensure();Set<String> keys = redisTemplate.keys("*");assert keys != null;keys.forEach(val -> {redisTemplate.delete(val);});}@Overridepublic int getSize() {ensure();Long size = redisTemplate.execute((RedisCallback<Long>) RedisServerCommands::dbSize);assert size != null;return size.intValue();}@Overridepublic ReadWriteLock getReadWriteLock() {return lock;}
}

Spring容器工具类

@Component
public class SpringUtils implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic 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=truespring.redis.host=192.168.0.160
spring.redis.database=0
spring.redis.port=6379

 

  相关解决方案