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

相关推荐
白总Server43 分钟前
API架构解说
java·网络·jvm·物联网·安全·web安全·架构
rosener1 小时前
pom中无法下载下来的类外部引用只给一个jar的时候
java·jar
黄名富2 小时前
SQL 语句优化及编程方法
java·数据库·mysql
follycat2 小时前
ISCTF2024
java·网络·数据库·学习·网络安全·python3.11
星星不说话013 小时前
Redis的Zset在排行榜中应用
数据库·redis·缓存
北漂编程小王子3 小时前
spring boot 集成 redis 实现缓存的完整的例子
redis·spring·缓存·redis缓存·spring redis缓存
服务端相声演员4 小时前
IOException: Broken pipe与IOException: 远程主机强迫关闭了一个现有的连接
java·服务器·网络
灰阳阳4 小时前
2022年蓝桥杯JavaB组 省赛 题目解析(含AC_Code)
java·职场和发展·蓝桥杯·省赛·超详解
liuxin334455664 小时前
药典新篇:Spring Boot助力中药实验管理
数据库·spring boot·php