gradle依赖
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.1.0.RELEASE'
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类
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属性=写你写好的缓存类(全名)
比如:
这种的Redis缓存只会生效在Mapper.xml中定义好的Sql语句上。