当前位置: 首页 > article >正文

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.icon-default.png?t=O83Ahttps://github.com/openjweb/cloud/tree/master

       


http://www.kler.cn/a/394502.html

相关文章:

  • Linux—进程学习-02
  • 必修 -- 常用笔试题
  • 基于RK3568J多网口电力可信物联网关解决方案
  • ⾃动化运维利器Ansible-基础
  • 图论-代码随想录刷题记录[JAVA]
  • opencv常用api
  • 职场中天天工作太累太无趣
  • 前端呈现效果:鱼眼相机城市环境图像分割
  • SQL语句执行的基本架构——数据库
  • Dify + Xinference:一站式本地 LLM 私有化部署和应用开发
  • 【C#设计模式(10)——装饰器模式(Decorator Pattern)】
  • 3D意识(3D Awareness)浅析
  • 《InsCode AI IDE:编程新时代的引领者》
  • 【Java】【Spring框架】【复习】1
  • RFC 2018 即《TCP Selective Acknowledgement Options》
  • 两大新兴开发语言大比拼:Move PK Rust
  • 自动驾驶仿真:软件在环(SIL)测试详解(精简版入门)
  • 华为云租户网络-用的是隧道技术
  • PC端微信多开
  • 嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
  • Ps:OpenColorIO 设置
  • HTML5和CSS3的进阶_HTML5和CSS3的新增特性
  • 如何选择适合小团队的项目管理软件?8款软件推荐
  • Zookeeper的安装与使用
  • 【XML协议】轻松掌握使用C++ XML解析库——pugixml
  • 电脑技巧:推荐一款开源免费的多显示器管理工具Dual Monitor Tools