1、搭建redis环境
yum install redis 前提需要判断是否安装gcc
查看redis是否安装 redis-server -v
设置redis后台启动 需要修改配置
whereis redis 查看配置文件位置
修改redis.conf daemonize yes
设置自己的密码 requirepass xxxxxxx
重启:service redis restart
可设置开机启动: chkconfig redis on
2、搭建项目环境
数据库连接池
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
pagehelper:
helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
mybatis-plus:
# config-location: classpath:mapper/mybatis-config.xml
mapper-locations: classpath*:mapper/**/*.xml
configuration:
cache-enabled: true #开启二级缓存
type-aliases-package: com.xxx #扫描的包
global-config:
db-config:
id-type: auto
field-strategy: not_null
添加redis配置
package com.medtion.framework.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis
*
* @author chenygs.
* @date 2019/5/17.
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory factory;
@Bean("RedisTemplate")
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
//默认序列化
// redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(getJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
private Jackson2JsonRedisSerializer getJackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//设置需要序列化的类必须是非Final的 否则抛异常
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
@Bean
public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
return redisTemplate.opsForValue();
}
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}
添加自定义二级缓存类
package com.medtion.common.cache;
import com.medtion.common.utils.ApplicationContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisServerCommands;
import org.springframework.data.redis.core.RedisTemplate;
import java.time.Duration;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author chenygs.
* @date 2019/5/17.
*/
@Slf4j
public class MybatisRedisCache implements Cache {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
private static final RedisTemplate<String, Object> REDISTEMPLATE = ApplicationContextUtils.getBean("RedisTemplate");
private String id;
public MybatisRedisCache(final String id) {
if (StringUtils.isBlank(id)) {
throw new IllegalArgumentException("Cache instances require an ID");
}
this.id = id;
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object key, Object value) {
if (value != null) {
log.debug("保存缓存");
//保存数据并设置其过期时间为1天
REDISTEMPLATE.opsForValue().set(key.toString(), value, Duration.ofDays(1));
}
}
@Override
public Object getObject(Object key) {
try {
if (key != null) {
return REDISTEMPLATE.opsForValue().get(key.toString());
}
} catch (Exception e) {
log.error("缓存出错 ");
}
return null;
}
@Override
public Object removeObject(Object key) {
if (key != null) {
log.debug("清除缓存");
REDISTEMPLATE.delete(key.toString());
}
return null;
}
@Override
public void clear() {
log.debug("清空缓存");
Set<String> keys = REDISTEMPLATE.keys("*:" + this.id + "*");
if (!CollectionUtils.isEmpty(keys)) {
REDISTEMPLATE.delete(keys);
}
}
@Override
public int getSize() {
Long size = REDISTEMPLATE.execute(RedisServerCommands::dbSize);
return size.intValue();
}
@Override
public ReadWriteLock getReadWriteLock() {
return this.readWriteLock;
}
}
在mapper层接口上添加注解
![62efdafb824d36f17841542bb64ceeae.png](https://img-blog.csdnimg.cn/img_convert/62efdafb824d36f17841542bb64ceeae.png)
在xml上添加缓存依赖
![5fae48ce7725de8d05b62bb81c05fabb.png](https://img-blog.csdnimg.cn/img_convert/5fae48ce7725de8d05b62bb81c05fabb.png)
这就可以使用redis作为mybatis二级缓存了
存在问题:mapper层接口方法无法使用 @SELECT 注解目前没有找到可行方案