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

相关推荐
benbenAItalk2 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl2 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin3 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885723 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
Java锁
java·开发语言
shehuiyuelaiyuehao5 小时前
1计算机是如何工作的
java·计算机网络
letisgo55 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周5 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8446 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘6 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言