Maison  >  Article  >  base de données  >  Comment SpringBoot intègre Redis pour sérialiser et stocker des objets Java

Comment SpringBoot intègre Redis pour sérialiser et stocker des objets Java

WBOY
WBOYavant
2023-05-29 08:43:101356parcourir

1. Contexte

1. Réflexion

Grâce à nos études précédentes, nous pouvons déjà stocker des chaînes dans Redis, alors que devons-nous faire si nous voulons stocker des objets Java dans Redis ?

2. Solution

Nous pouvons convertir des objets Java en objets JSON, puis les convertir en chaînes JSON et les stocker dans Redis. Ensuite, lorsque nous extrayons les données de Redis, nous pouvons uniquement extraire les chaînes et les convertir en. Objets Java, cette série d'opérations vous semble-t-elle un peu gênante ?

2. Analyse du code source

Comment SpringBoot intègre Redis pour sérialiser et stocker des objets Java

  • Ce qui précède est l'extrait de code source dans la classe RedisAutoConfiguration. On peut voir que lorsque SpringBoot configure automatiquement Redis, il injecte redisTemplate et stringRedisTemplate dans le conteneur

  • Parmi. eux, RedisTemplate signifie que le type de clé est Object et le type de valeur est Object, mais ce dont nous avons souvent besoin est RedisTemplate, ce qui nous oblige à réinjecter un Bean RedisTemplate dont le type générique est RedisTemplate, et définissez la méthode de sérialisation de la clé et de la valeur

  • Après avoir vu cette annotation @ConditionalOnMissingBean, vous savez que s'il y a un objet RedisTemplate dans le conteneur Spring, ce RedisTemplate automatiquement configuré ne sera pas instancié. Par conséquent, nous avons la possibilité d'écrire des classes de configuration personnalisées pour configurer RedisTemplate.

3. Injecter RedisTemplate

1. Introduire les dépendances

<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Ce qui précède a introduit les dépendances de Redis, veuillez ajouter d'autres dépendances par vous-même

2. Le noyau de Redis Nous mettons la configuration dans le fichier 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

Nous avons injecté un Bean nommé redisTemplate et tapons RedisTemplate La clé utilise la méthode de sérialisation StringRedisSerializer et la valeur utilise la méthode de sérialisation Jackson2JsonRedisSerializer 4. .Classe de l'outil Redis

Nous avons mis une série d'opérations sur Redis dans le fichier RedisUtils.java

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

Nous avons écrit deux méthodes, get et set, pour tester

Quatre Test

1 Créez la classe d'entité Java UserInfo

.
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. Cas de test

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

Nous stockons une donnée avec la clé "user" et la valeur en tant qu'objet UserInfo dans Redis, puis obtenons les données en fonction de la clé

3. nous avons réussi à enregistrer les données de l'objet Java dans Redis et à obtenir l'objet avec succès.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer