Redis是项目开发中必不可少的缓存工具。所以在SpringBoot项目中必须整合Redis。下面是Redis整合的步骤:
(1)因为目前使用openjweb-sys作为SpringBoot的启动应用,所以在openjweb-sys模块的application-dev.yml中增加配置参数:
spring:
redis:
database: 0
host: 127.0.0.1
port: 63899
password: 123456
timeout: 1800000
jedis:
pool:
enabled: true
max-active: 8
max-idle: 8
max-wait: -1ms
min-idle: 0
lettuce:
pool:
#
max-wait: -1
#
max-idle: 5
min-idle: 0
max-active: 20
注意因为yml中已经有了spring顶级标签,增加配置的时候注意将上面spring下的参数配置到spring标签下面,注意要缩进一个空格。上面的相关参数仅是示例参数,生产环境中需要进行调整。
(2)因为项目结构中有独立的redis-openjweb-starter模块,在openjweb-sys中引用这个模块需要加入依赖,所以在openjweb-sys的pom.xml中增加依赖设置:
<dependency>
<groupId>org.openjweb</groupId>
<artifactId>redis-openjweb-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
(3)在redis-openjweb-starter的pom.xml中需要引入redis的依赖和jackson依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
(4)在redis-openjweb-starter的org.openjweb.redis.starter.config包下创建Redis配置类
RedisConfig:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();//创建RedisTemplate
redisTemplate.setConnectionFactory(connectionFactory);// // 配置连接工厂,这里还可以自定义链接工厂
//配置序列化规则
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//使用StringRedisSerializer来序列化和反序列化redis的key值
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 值采用json序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hash key 和value序列化模式
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
//为节省篇幅,可从本例的github中下载完成代码,也可以参考另外技术大牛的博客。
}
另外在org.openjweb.redis.starter.util下创建一个工具类RedisUtil,此工具类封装各种常规的redis的get、set操作(详见Github中的项目示例 )。
(5) 接下来在openjweb-sys模块中创建测试API类(RedisDemoApi):
package org.openjweb.sys.api;
import lombok.extern.slf4j.Slf4j;
import org.openjweb.redis.starter.util.RedisUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
//测试:http://localhost:8001/demo/api/redis/set?key=name&value=abao
//测试:http://localhost:8001/api/redis/get?key=name
//测试:http://localhost:8001/api/redis/get2?key=name
@Slf4j
@RequestMapping("/demo/api/redis")
@RestController
public class RedisDemoApi {
@Resource
private RedisUtil redisUtil;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisTemplate redisTemplate;
@RequestMapping("set")
public boolean redisset(String key, String value){
log.info("传入的key和value:"+key+"--"+value);
//默认秒数
//return redisUtil.set(key,value);
//指定秒数
boolean bool = redisUtil.set(key,value,60);//设置1分钟有效时长
return bool;
}
@RequestMapping("get")
public Object redisget(String key){
log.info("传入的key:");
log.info(key);
log.info(String.valueOf(redisUtil.get(key)));
return redisUtil.get(key);
}
@RequestMapping("get2")
public Object redisget2(String key){
String value = stringRedisTemplate.opsForValue().get(key);
log.info("使用stringRedisTemplate获取:");
log.info(value);//这个返回带引号的
value = String.valueOf(redisTemplate.opsForValue().get(key));
log.info("使用redisTemplate获取:");
log.info(value);//这个返回带引号的
return value;
}
@RequestMapping("expire")
public boolean expire(String key,long ExpireTime){
return redisUtil.expire(key,ExpireTime);
}
}
其中http://localhost:8001/demo/api/redis/set?key=name\&value=abao 设置redis key为name,值为abao
http://localhost:8001/api/redis/get?key=name 是根据key为name获取key的值为abao
这两个接口的方法都是使用的RedisUtil封装的方法,如果不只用RedisUtil封装的方法,也可以直接引用RedisTemplate方法,在上面的代码中,使用@Resource注入了RedisTemplate和StringRedisTemplate:
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisTemplate redisTemplate;
然后在 redisget2 方法中分别使用了
String value = stringRedisTemplate.opsForValue().get(key);
value = String.valueOf(redisTemplate.opsForValue().get(key));
两种方法获取key的值。
测试链接:
http://localhost:8001/api/redis/get2?key=name
注意:如果项目应用到生产环境,请删掉或注释掉掉类顶部的
@RequestMapping("/demo/api/redis") 注解。