Heim >Datenbank >Redis >Wie SpringBoot Redis integriert, um Java-Objekte zu serialisieren und zu speichern

Wie SpringBoot Redis integriert, um Java-Objekte zu serialisieren und zu speichern

WBOY
WBOYnach vorne
2023-05-29 08:43:101489Durchsuche

1. Hintergrund

1. Durch unsere bisherigen Studien können wir Strings bereits in Redis speichern. Was sollten wir also tun, wenn wir Java-Objekte in Redis speichern möchten?

2. Lösung

Wir können Java-Objekte in JSON-Objekte konvertieren, sie dann in JSON-Strings umwandeln und sie in Redis speichern. Wenn wir dann die Daten aus Redis herausnehmen, können wir nur die Strings herausnehmen und in sie konvertieren Scheint diese Reihe von Vorgängen bei Java-Objekten etwas mühsam zu sein?

2. Quellcode-Analyse

Wie SpringBoot Redis integriert, um Java-Objekte zu serialisieren und zu speichern

    Das Obige ist das Quellcode-Snippet in der RedisAutoConfiguration-Klasse. Es ist ersichtlich, dass RedisTemplate und stringRedisTemplate in den Container eingefügt werden Für sie bedeutet RedisTemplate, dass der Schlüsseltyp Object und der Werttyp Object ist. Was wir jedoch häufig benötigen, ist RedisTemplate, was erfordert, dass wir ein RedisTemplate-Bean erneut einfügen, dessen generischer Typ RedisTemplate und legen Sie die Serialisierungsmethode für Schlüssel und Wert fest
  • Nachdem Sie diese @ConditionalOnMissingBean-Annotation gesehen haben, wissen Sie, dass dieses automatisch konfigurierte RedisTemplate nicht instanziiert wird, wenn sich im Spring-Container ein RedisTemplate-Objekt befindet. Daher haben wir die Möglichkeit, benutzerdefinierte Konfigurationsklassen zu schreiben, um RedisTemplate zu konfigurieren.
  • 3. Inject RedisTemplate
  • 1. Abhängigkeiten von Redis einführen, bitte fügen Sie selbst andere Abhängigkeiten hinzu

    <!-- redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  • 3 Der Kern von Redis Wir haben die Konfiguration in die Datei RedisConfig.java eingefügt. Wir haben eine Bean namens redisTemplate eingefügt und den Schlüssel RedisTemplate eingegeben, und der Wert verwendet die Serialisierungsmethode Jackson2JsonRedisSerializer . Redis-Tool-Klasse

Wir haben eine Reihe von Operationen auf Redis in die RedisUtils.java-Datei eingefügt

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

Wir haben zwei Methoden geschrieben, get und set, zum Testen

1. Erstellen Sie die Java-Entitätsklasse UserInfo

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;
    }
}

2. Testfall

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;
    }
}

Wir speichern Daten mit dem Schlüssel „Benutzer“ und dem Wert als UserInfo-Objekt und rufen die Daten dann basierend auf dem Schlüssel ab

Sie können Out sehen, Wir haben die Java-Objektdaten erfolgreich in Redis gespeichert und das Objekt erfolgreich abgerufen.

Das obige ist der detaillierte Inhalt vonWie SpringBoot Redis integriert, um Java-Objekte zu serialisieren und zu speichern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen