ホームページ  >  記事  >  データベース  >  SpringBoot が Redis を統合して Java オブジェクトをシリアル化および保存する方法

SpringBoot が Redis を統合して Java オブジェクトをシリアル化および保存する方法

WBOY
WBOY転載
2023-05-29 08:43:101439ブラウズ

1. 背景

1. 考え方

これまでの研究で、文字列を Redis に保存できることがわかったので、Java オブジェクトを Redis に保存するにはどうすればよいでしょうか?

2. 解決策

Java オブジェクトを JSON オブジェクトに変換し、さらに JSON 文字列に変換して Redis に保存し、Redis からデータを取り出すときに、取り出せるのは文字列を取得してJavaオブジェクトに変換する、この一連の操作は少し面倒だと思いませんか?

2. ソース コード分析

SpringBoot が Redis を統合して Java オブジェクトをシリアル化および保存する方法

  • 上記は、RedisAutoConfiguration クラスのソース コードの一部です。 Redisの設定を自動で行ってくれます その際、redisTemplateとstringRedisTemplate

  • をコンテナに注入しました RedisTemplateはキーの型がObject、値の型がObjectという意味ですが、多くの場合必要なのは RedisTemplate です。これには、RedisTemplate Bean を再挿入する必要があります。そのジェネリック タイプは RedisTemplate で、キーと値のシリアル化メソッドを設定します

  • #この @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 接続情報

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

3. Redis コア構成クラス

Redis のコア構成を RedisConfig.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;
    }
}

redisTemplate という名前のファイル、RedisTemplate タイプの Bean を挿入します。キーは StringRedisSerializer シリアル化メソッドを使用し、値は Jackson2JsonRedisSerializer シリアル化メソッドを使用します

4、Redis ツール クラス

一連の Redis を実行します 一連の操作は RedisUtils.java ファイルに配置されます

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

テスト用の get メソッドと set メソッドを作成しました

4. Test

1. Java エンティティ クラス UserInfo

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

を作成します。テスト ケース

package com.zyxx.redistest;

import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
class RedisTestApplicationTests {

    @Autowired
    private RedisUtils redisUtil;

    @Test
    void contextLoads() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("jack");
        userInfo.setCreateTime(new Date());
        // 放入redis
        redisUtil.set("user", userInfo);
        // 从redis中获取
		System.out.println("获取到数据:" + redisUtil.get("user"));
    }
}

キー「user」と値を UserInfo オブジェクトとして Redis に保存し、それに基づいてデータを取得します。 key

3. テスト結果

SpringBoot が Redis を統合して Java オブジェクトをシリアル化および保存する方法

Java オブジェクト データを Redis に保存し、オブジェクトを正常に取得できたことがわかります。

以上がSpringBoot が Redis を統合して Java オブジェクトをシリアル化および保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。