>  기사  >  데이터 베이스  >  SpringBoot가 Redis를 통합하여 Java 객체를 직렬화하고 저장하는 방법

SpringBoot가 Redis를 통합하여 Java 객체를 직렬화하고 저장하는 방법

WBOY
WBOY앞으로
2023-05-29 08:43:101454검색

1. 배경

1. 생각

이전 연구를 통해 이미 Redis에 문자열을 저장할 수 있는데, Java 객체를 Redis에 저장하려면 어떻게 해야 할까요?

2. 솔루션

Java 개체를 JSON 개체로 변환한 다음 이를 JSON 문자열로 변환하고 Redis에 저장할 수 있습니다. 그런 다음 Redis에서 데이터를 가져올 때 문자열만 꺼내어 Java 개체로 변환할 수 있습니다. , 이 일련의 작업이 조금 번거로운 것 같나요?

2. 소스 코드 분석

SpringBoot가 Redis를 통합하여 Java 객체를 직렬화하고 저장하는 방법

  • 위는 RedisAutoConfiguration 클래스의 소스 코드입니다. SpringBoot가 자동으로 Redis를 구성할 때 redisTemplate과 stringRedisTemplate을 컨테이너에 주입하는 것을 볼 수 있습니다. RedisTemplate는 키 유형이 Object이고 값 유형이 Object라는 것을 의미하지만 우리에게 자주 필요한 것은 RedisTemplate입니다. 이는 일반 유형이 RedisTemplate<인 RedisTemplate Bean을 다시 주입해야 합니다. ;String , Object> 그리고 키와 값의 직렬화 방법을 설정합니다

  • 이 @ConditionalOnMissingBean 주석을 보고 나면 Spring 컨테이너에 RedisTemplate 객체가 있으면 자동으로 구성된 RedisTemplate이 인스턴스화되지 않는다는 것을 알 수 있습니다. 따라서 RedisTemplate을 구성하기 위해 사용자 정의 구성 클래스를 작성할 수 있습니다.

  • 3. RedisTemplate 삽입

  • 1. 종속성 소개
<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

위에서는 Redis의 종속성을 소개했습니다. 다른 종속성을 직접 추가하세요

2. Redis 핵심 구성 클래스

Redis의 핵심 RedisConfig.java 파일에 구성을 넣었습니다

spring:
  # Redis配置
  redis:
    host: 127.0.0.1
    port: 6379
    database: 10
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 50
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 3000ms
        # 连接池中的最大空闲连接数
        max-idle: 20
        # 连接池中的最小空闲连接数
        min-idle: 5
    # 连接超时时间(毫秒)
    timeout: 5000ms

redisTemplate이라는 Bean을 삽입하고 RedisTemplate 유형을 입력했습니다. 키는 StringRedisSerializer 직렬화 방법을 사용하고 값은 Jackson2JsonRedisSerializer 직렬화 방법을 사용합니다. . Redis 도구 클래스

RedisUtils.java 파일에 Redis에 대한 일련의 작업을 넣었습니다

package com.zyxx.redistest.common;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @ClassName RedisConfig
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 9:48:48
 **/

@Configuration
public class RedisConfig {

    /**
     * RedisTemplate配置
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		// 配置redisTemplate
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置序列化
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // Hash key序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash value序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

테스트를 위해 get 및 set이라는 두 가지 메서드를 작성했습니다. Test

1.

package com.zyxx.redistest.common;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @ClassName RedisUtils
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 10:10:10
 **/
@Slf4j
@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 根据key读取数据
     */
    public Object get(final String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        try {
            return redisTemplate.opsForValue().get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 写入数据
     */
    public boolean set(final String key, Object value) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        try {
            redisTemplate.opsForValue().set(key, value);
            log.info("存入redis成功,key:{},value:{}", key, value);
            return true;
        } catch (Exception e) {
            log.error("存入redis失败,key:{},value:{}", key, value);
            e.printStackTrace();
        }
        return false;
    }
}

2. 테스트 케이스

package com.zyxx.redistest.common;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @ClassName UserInfo
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 10:12:12
 **/
@Data
public class UserInfo implements Serializable {
    /**
     * id
     */
    private Integer id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 创建时间
     */
    private Date createTime;
}

UserInfo 객체로 키 "user"와 함께 데이터를 Redis에 저장한 다음 키

3를 기반으로 데이터를 가져옵니다. Java 객체 데이터를 Redis에 성공적으로 저장하고 객체를 성공적으로 얻었습니다.

위 내용은 SpringBoot가 Redis를 통합하여 Java 객체를 직렬화하고 저장하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제