Redis之RedisTemplate配置(序列和反序列化)

一、前言

对于redis操作,springboot进行了很好的封装,那就是spring data redis。提供了一个高度封装的RedisTemplate类来进行一系列redis操作,连接池自动管理;同时将事务封装操作,交由容器进行处理。
针对数据的“序列化和反序列化”,提供了多种策略(RedisSerializer)
默认为使用JdkSerializationRedisSerializer,同时还有StringRedisSerializer,JacksonJsonRedisSerializer,OxmSerializer,GenericFastJsonRedisSerializer。

二、简介一下

JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前默认的序列化策略。

StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。

JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】

GenericFastJsonRedisSerializer:另一种javabean与json之间的转换,同时也需要指定Class类型。

OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】

三、实践

1)依赖(版本继承了SpringBoot版本)

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

2)RedisConfig类
添加bean,指定key/value以及HashKey和HashValue的序列化和反序列化为FastJson的。

package com.sleb.springcloud.common.config;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
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.GenericToStringSerializer;

/**
 * redis配置
 * @author 追到乌云的尽头找太阳(Jacob)
 **/
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用 GenericFastJsonRedisSerializer 替换默认序列化
        GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
        // 设置key和value的序列化规则
        redisTemplate.setKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
        // 设置hashKey和hashValue的序列化规则
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);
        // 设置支持事物
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

四、欢迎扫码关注微信公账号《追到乌云的尽头找太阳》

在这里插入图片描述

配置 RedisTemplate 序列化可以提高数据的读写效率可读性,以下是几种常见的配置方法: ### 自定义序列化方式 可以创建一个配置类,在其中自定义 RedisTemplate序列化方式。示例代码如下: ```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.RedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { // 创建 RedisTemplate 对象 RedisTemplate<Object, Object> template = new RedisTemplate<>(); // 设置连接工厂 template.setConnectionFactory(connectionFactory); // 创建 JSON 序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 设置 Key 的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 设置 Value 的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } } ``` 这种配置方式中,Key 使用 String 序列化,Value 使用 JSON 序列化,避免了 Redis 默认 JDK 序列化键值识别性差的问题[^2]。 ### 使用 Jackson2JsonRedisSerializer 一般来说,Redis 存储的键用字符串形式,值用 JSON 形式,使用 Jackson2JsonRedisSerializer 可以自动进行序列化反序列化,无需手动处理。不过需要注意,使用 GenericJackson2JsonRedisSerializer 配置序列化时,在 Redis 存储中会有一个 `@class` 字段指定数据类型,会占用一定空间[^4]。 ### 结合 StringRedisTemplate 可以结合 StringRedisTemplate 进行测试,示例代码如下: ```java import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.StringRedisTemplate; @SpringBootTest class RedisTestApplicationTests { @Autowired private StringRedisTemplate stringRedisTemplate; // Json 工具 private ObjectMapper mapper = new ObjectMapper(); @Test void StringTemplate() throws Exception { User user = new User("青秋", 18); // 手动序列化 String json = mapper.writeValueAsString(user); // 写入数据 stringRedisTemplate.opsForValue().set("stringredistemplate", json); // 读取数据 String val = stringRedisTemplate.opsForValue().get("stringredistemplate"); // 反序列化 User u = mapper.readValue(val, User.class); System.out.println(u); } } ``` RedisTemplate 默认使用 JdkSerializationRedisSerializer 存入数据,会将数据先序列化成字节数组再存入 Redis 数据库,这种方式存储的 value 不可读。而 StringRedisTemplate 可以处理正常的可读字符串数据。当需要获取的数据不是以字节数组存在 Redis 中时,使用 StringRedisTemplate 或专门设置 RedisTemplate序列化器是更好的选择[^3]。 ### 针对 LocalDateTime 配置 ObjectMapper 使用 Jackson2JsonRedisSerializer 构造器时,ObjectMapper 内部不会对 LocalDateTime 进行字符串化,而是保持对象化,反序列化时会报错。因此需要针对 LocalDateTime 配置自己的 ObjectMapper。同时,Jackson2JsonRedisSerializer 序列化提供的 ObjectMapper 在没有设置反序列化时,对象会以 LinkedHashMap 的形式存储,也需要单独对其进行配置[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值