IntelliJ+SpringBoot项目实战(七)--在SpringBoot中整合Redis
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") 注解。
项目完整代码见:GitHub - openjweb/cloud at masterOpenJWeb is a java bases low code platform. Contribute to openjweb/cloud development by creating an account on GitHub.https://github.com/openjweb/cloud/tree/master