如何在SpringBoot中设置RedisTemplate的序列化方式

本文介绍了在SpringBoot中设置RedisTemplate的两种序列化方式:一种是通过配置类自动序列化,使用GenericJackson2JsonRedisSerializer;另一种是使用StringRedisTemplate手动序列化,通过ObjectMapper进行对象与JSON的转换。每种方式的优缺点也进行了说明,自动序列化可能会增加额外的内存开销,而手动序列化则可以避免这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何在SpringBoot中设置RedisTemplate的序列化方式

1、第一种方式:写配置类(自动序列化)

1.1、导入相关依赖坐标

<!-- redis依赖 -->    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    
<!-- common-pool 连接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

注意事项:Spring Data Redis 默认使用的是Redis的Java客户端Lettuce依赖,如果要使用Jedis,则必须要导入下面的jedis依赖。并且Spring Data Redis 提供的序列化器依赖于Jackson库,所以需要确保相关的依赖已经被引入到项目中。如果没有则引入下面的Jackson库依赖。

<!-- Redis的Java客户端Jedis依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>    
    
<!-- Jackson依赖 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

1.2、在application.yml文件配置Redis相关信息

# Redis配置
spring:
  redis:
    host: localhost # 连接的IP地址
    port: 6379 # Redis端口号
    #password: 123456  #连接的密码
    database: 0 # 操作的是0号数据库
    #jedis:   # jedis配置,看你使用那种Redis的Java客户端
    lettuce:  # lettuce配置,看你使用那种Redis的Java客户端
        # 连接池配置
        pool:
          max-active: 8 # 连接池的最大连接数
          max-idle: 8    # 连接池中的最大空闲连接
          min-idle: 0     # 连接池中的最小空闲连接
          max-wait: 10ms   # 连接池最大阻塞等待时间

1.3、编写RedisConfig配置类信息

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置Redis连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        // 创建JSON序列化器(两种设置Value和HashValue的JSON的序列化器)
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer 
                                                          = new GenericJackson2JsonRedisSerializer();
        /*Jackson2JsonRedisSerializer jackson2JsonRedisSerializer
                                                          = new Jackson2JsonRedisSerializer<>(Object.class);*/

        // 设置Key和HashKey采用String序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value和HashValue采用JSON的序列化
        template.setValueSerializer(genericJackson2JsonRedisSerializer);
        template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        //template.setValueSerializer(jackson2JsonRedisSerializer);
        //template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

}

1.4、测试案例

@SpringBootTest
class RedisTemplateTests {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Test
    void testUser() {
        // 向Redis数据库写入数据
        User user1 = new User(1,"Redis",36);
        redisTemplate.opsForValue().set("user:1", user1);

        // 向Redis数据库获取数据
        Object user2 = redisTemplate.opsForValue().get("user:1");
        System.out.println(user2);
    }
}

image-20230617220529565

image-20230617220328741

2、第二种方式:使用 StringRedisTemplate(手动序列化)

2.1、导入相关依赖

<!-- redis依赖 -->    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    
<!-- common-pool连接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

注意事项:Spring Data Redis 默认使用的是Redis的Java客户端Lettuce依赖,如果要使用Jedis,则必须要导入下面的jedis依赖。并且Spring Data Redis 提供的序列化器依赖于Jackson库,所以需要确保相关的依赖已经被引入到项目中。如果没有则引入下面的Jackson库依赖。

<!-- Redis的Java客户端Jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>    
    
<!-- Jackson依赖 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

2.2、在application.yml文件配置Redis相关信息

# Redis配置
spring:
  redis:
    host: localhost # 连接的IP地址
    port: 6379 # Redis端口号
    #password: 123456  #连接的密码
    database: 0 # 操作的是0号数据库
    #jedis:   # jedis配置,看你使用那种Redis的Java客户端
    lettuce:  # lettuce配置,看你使用那种Redis的Java客户端
        # 连接池配置
        pool:
          max-active: 8 # 连接池的最大连接数
          max-idle: 8    # 连接池中的最大空闲连接
          min-idle: 0     # 连接池中的最小空闲连接
          max-wait: 10ms   # 连接池最大阻塞等待时间

2.3、测试案例

@SpringBootTest
class StringRedisTemplateTests {
    
    private static final ObjectMapper mapper = new ObjectMapper();

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testUser() throws JsonProcessingException {
        // 向Redis数据库写入数据
        User user1 = new User(2, "Redis2", 18);
        // 手动序列化对象为JSON对象
        String jsonUser1 = mapper.writeValueAsString(user1);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user:2", jsonUser1);

        // 向Redis数据库获取数据
        String jsonUser2 = stringRedisTemplate.opsForValue().get("user:2");
        // 手动反序列化对象为Java对象
        User user2 = mapper.readValue(jsonUser2, User.class);
        System.out.println(user2);
    }
}

image-20230617222510722

image-20230617222829128

3、总结

第一种方式:采用自动序列化的方式,会将类的class类型写入json数据中,一并存入到Redis数据库当中。会带来额外的内存开销。

image-20230617223929869

第二种方式:采用手动序列化的方式,需要我们手动序列化java对象与json对象。不会带来额外的内存开销。
image-20230617224531265

<think>嗯,用户想知道如何在Spring Boot 3.0.2中配置RedisTemplate实现JSON序列化。首先,我需要回忆一下RedisTemplate的基本配置方法。在Spring Boot中,默认的RedisTemplate使用JdkSerializationRedisSerializer,这会导致存储的数据不易阅读,所以用户想换成JSON格式。 首先,可能需要添加相关的依赖。比如,Spring Boot Starter Data Redis,还有JSON处理库比如Jackson的依赖。不过,Spring Boot可能已经自带Jackson,所以是否需要显式引入呢?需要检查一下。 接下来,配置Redis连接,通常是在application.properties里设置host、port、password这些。然后,创建一个配置类,比如RedisConfig,用@Configuration注解,并在里面定义RedisConnectionFactory,可能还需要配置Lettuce或者Jedis的连接。不过Spring Boot 2.x之后默认用Lettuce,所以用户可能不需要改这个,除非有特殊需求。 然后,关键是如何配置RedisTemplate序列化方式。需要创建RedisTemplate的Bean,并设置key和value的序列化器。对于JSON,可以使用GenericJackson2JsonRedisSerializer,或者自定义ObjectMapper。例如,可能先配置一个ObjectMapper,设置一些特性,比如禁用FAIL_ON_UNKNOWN_PROPERTIES,然后将其注入到RedisTemplate中。 另外,还要考虑hash key和hash value的序列化,通常使用String序列化器,比如StringRedisSerializer,这样键会是可读的字符串,而值则是JSON格式。 可能还需要在配置类中启用缓存相关的注解,比如@EnableCaching,但用户的问题可能不涉及缓存,而是直接使用RedisTemplate。 然后,用户可能需要一个例子,展示如何配置这些Bean,比如RedisTemplate<String, Object>,并设置序列化器。同时,测试一下是否正确存储和读取JSON数据。 还需要考虑是否要处理泛型类型,GenericJackson2JsonRedisSerializer会在JSON中添加类型信息,这样反序列化时不会有问题。而Jackson2JsonRedisSerializer可能需要明确的类型,但在配置时可能更灵活。 可能还需要参考Spring Boot的官方文档,确认在3.0.2版本中是否有变化。例如,自动配置类可能涉及RedisAutoConfiguration,而用户需要自定义覆盖默认的RedisTemplate。 另外,用户提供的引用中有提到CacheAutoConfiguration,但用户的问题是关于RedisTemplate的,所以可能这部分引用不太相关。但另一个引用提到@KafkaListener,这和当前问题无关,但可能用户之前有相关的问题,需要忽略这部分。 最后,要确保代码示例正确,比如配置类、Bean的定义,以及使用@Autowired注入RedisTemplate,并在服务类中使用它来操作数据。测试的时候,保存一个对象到Redis,然后读取出来,确保序列化和反序列化正确。 可能还需要提到排除默认的序列化器,或者处理潜在的序列化问题,比如日期格式、空值处理等。这些可以通过自定义ObjectMapper来调整。 总结步骤:添加依赖,配置连接信息,创建配置类,定义RedisTemplate Bean并设置JSON序列化器,测试验证。</think>在Spring Boot 3.0.2中配置`RedisTemplate`实现JSON序列化需通过以下步骤实现: --- ### 步骤1:添加依赖 在`pom.xml`中引入Spring Data Redis和Jackson依赖: ```xml <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> </dependency> ``` --- ### 步骤2:配置Redis连接 在`application.properties`中设置Redis连接信息: ```properties spring.data.redis.host=localhost spring.data.redis.port=6379 spring.data.redis.password= ``` --- ### 步骤3:自定义RedisTemplate 创建配置类`RedisConfig`,覆盖默认的序列化方式: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 设置Key序列化为String template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 设置Value序列化为JSON GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); template.afterPropertiesSet(); return template; } } ``` --- ### 步骤4:使用RedisTemplate操作数据 在Service类中注入并使用: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveUser(String key, User user) { redisTemplate.opsForValue().set(key, user); } public User getUser(String key) { return (User) redisTemplate.opsForValue().get(key); } } ``` --- ### 关键点说明 1. **序列化选择** - `GenericJackson2JsonRedisSerializer`会在JSON中添加类型元数据(如`@class`字段),确保反序列化时类型正确[^1]。 - 若需自定义JSON格式(如日期处理),可注入`ObjectMapper`实例并配置。 2. **性能优化** 通过`StringRedisSerializer`优化键的存储效率,避免二进制乱码问题[^2]。 --- ### 测试验证 存储对象后,Redis中会显示类似: ```json { "@class": "com.example.User", "id": 1, "name": "John" } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值