SpringBoot使用Redis做查询集中缓存(MyBatis二级缓存采用Redis配置)
首先必须的配置:yml和pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
#数据库连接属性配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hospital?serverTimezone=Asia/Shanghai username: root password: 614 #security配置 jackson: serialization: indent_output: true #Redis配置 redis: host: 127.0.0.1 port: 6379 #Redis连接池配置 jedis: pool: min-idle: 0 max-idle: 8 max-active: 8 max-wait: -1ms #mybatis实体类名 mybatis: type-aliases-package: top.yibobo.hospital.domain configuration: #到下划线的表字段自动映射成驼峰命名法 map-underscore-to-camel-case: true mapper-locations: classpath:mybatis/mapper/*.xml #设置服务器端口号/session保存时长 server: port: 8086 #定义日志文件路径 logging: file: logs/all.log level: org.springframework.security: info top.yibobo.hospital.mapper: debug top.yibobo.hospital.util: debug #JWT配置 jwt: header: Authorization #请求头部属性名 secret: mySecret #自定义口令 expiration: 604800 #token失效时间 route: #访问路径 authentication: path: /auth refresh: /refresh
这个时候需要在总启动类的类上写上该注释:@EnableCaching,使用Redis缓存
然后写一个缓存类,实现MyBatis的二级缓存,就是实现org.apache.ibatis.cache.Cache类
我已经写好了,放上来吧:
最重要的类!!!
package top.yibobo.hospital.util; import org.apache.ibatis.cache.Cache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /* 使用Redis实现MyBatis的二级缓存 */ public class RedisCache implements Cache{ //日志记录器定义 private static final Logger logger = LoggerFactory.getLogger(RedisCache.class); //缓存对象唯一标识 private final String id; //用于事务缓存对象的读写锁 private static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //用于将缓存对象写入Redis的模板对象 private RedisTemplate redisTemplate; //缓存对象失效时间 private static final long EXPRIRE_TIME_IN_MINUT=30; public RedisCache(String id){ if (id==null){ throw new IllegalArgumentException("缓存对象ID不能为空"); } this.id = id; } @Override public String getId() { return this.id; } /* 保存缓存对象的方法 */ @Override public void putObject(Object key, Object value) { try{ RedisTemplate redisTemplate = getRedisTemplate(); //得到值操作对象 ValueOperations operations = redisTemplate.opsForValue(); //通过值操作对象set缓存对象 operations.set(key,value,EXPRIRE_TIME_IN_MINUT, TimeUnit.MINUTES); logger.debug("缓存对象保存成功啦!!!"); }catch (Throwable t){ logger.error("缓存对象保存失败"+t); } } /* 获取缓存对象的方法 */ @Override public Object getObject(Object key) { try{ RedisTemplate redisTemplate = getRedisTemplate(); //得到值操作对象 ValueOperations operations = redisTemplate.opsForValue(); Object obj = operations.get(key); logger.debug("获取缓存对象成功"); return obj; }catch (Throwable t){ logger.error("缓存对象获取失败"+t); return null; } } /* 删除缓存对象 */ @Override public Object removeObject(Object key) { try{ RedisTemplate redisTemplate = getRedisTemplate(); redisTemplate.delete(key); logger.debug("删除缓存对象成功"); }catch (Throwable t){ logger.error("删除缓存对象失败"+t); } return null; } /* 清空所有缓存对象 */ @Override public void clear() { RedisTemplate redisTemplate = getRedisTemplate(); redisTemplate.execute((RedisCallback)collection ->{ collection.flushDb(); return null; }); logger.debug("清空缓存对象成功~"); } @Override public int getSize() { return 0; } @Override public ReadWriteLock getReadWriteLock(){ return readWriteLock; } private RedisTemplate getRedisTemplate(){ if (redisTemplate==null){ redisTemplate = ApplicationContextHolder.getBean("redisTemplate"); } return redisTemplate; } }
此时弄完的话,可以说是已经大功告成了!!,可是还需要指定哪个东西需要使用
有两种方式:
第一种、在MyBatis使用注解配置的类上面定义类注解:
@CacheNamespace(implementation = 你写的缓存类.class)
这种只会在该类下已写好注解 Sql语句的(@Select)才会采用。该类下没有定义注解Sql的是不会使用Redis缓存的。
第二种、在对应类的Mapper.xml文件配置
加上一句话: type属性=写你写好的缓存类(全名)
比如:
<cache type=”top.yibobo.hospital.util.RedisCache” />
这种的Redis缓存只会生效在Mapper.xml中定义好的Sql语句上。
这两种各需所需。有的方法及时性要求比较强的(比如用户登陆、密码修改),最好别用缓存