Springboot RedisTemplate序列化

Spring官方现在还存在的6大序列化器:

1.OxmSerializer

以xml格式存储(但还是String类型~),解析起来也比较复杂,效率也比较低。因此几乎没有人再使用此方式了。

2.JdkSerializationRedisSerializer

从源码里可以看出,这是RestTemplate类默认的序列化方式。若你没有自定义,那就是它了。
使用JDK自带的序列化方式,有明显的缺点:
首先它要求存储的对象都必须实现java.io.Serializable接口,比较笨重
其次,他存储的为二进制数据,这对开发者是不友好的
再次,因为他存储的为二进制。但是有时候,我们的Redis会在一个项目的多个project中共用,这样如果同一个可以缓存的对象在不同的project中要使用两个不同的key来分别缓存,既麻烦,又浪费。
使用JDK提供的序列化功能。 优点是反序列化时不需要提供(传入)类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。

@Autowired
private RedisTemplate redisTemplate;

@Test
 void contextLoads() {
     redisTemplate.opsForValue().set("user", new UserInfo("admin"));
     Object user = redisTemplate.opsForValue().get("user");
 }

直接序列化会报错误:

Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.example.blog.view.UserInfo]

必须让存储的对象实现 Serializable 接口

@Setter
@Getter
public class UserInfo implements Serializable {

    private String name;

    public UserInfo(String name) {
        this.name = name;
    }
}

虽然序列化成功了,但是存储的是二进制文件

3.StringRedisSerializer

也是StringRedisTemplate默认的序列化方式,key和value都会采用此方式进行序列化,是被推荐使用的,对开发者友好,轻量级,效率也比较高。

4.GenericToStringSerializer

他需要调用者给传一个对象到字符串互转的Converter(相当于转换为字符串的操作交给转换器去做),个人觉得使用起来其比较麻烦,还不如直接用字符串呢。所以不太推荐使用

5.Jackson2JsonRedisSerializer

从名字可以看出来,这是把一个对象以Json的形式存储,效率高且对调用者友好
优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。
但缺点也非常致命:那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其在反序列化过程中用到了类型信息(必须根据此类型信息完成反序列化)。

6.GenericJackson2JsonRedisSerializer

基本和上面的Jackson2JsonRedisSerializer功能差不多,使用方式也差不多。

指定RedisTemplate的序列化方式

指定序列化方式

@Configuration
public class RedisConfig {

    /**
     * redisTemplate 默认的序列化方式为 JdkSerializationRedisSerializer
     * StringRedisTemplate 的默认序列化方式为 StringRedisSerializer
     * 使用 fastJsonRedisSerializer 替换默认序列化方式
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);

        // 设置值value的序列化方式
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);

        // 设置键key的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

set/get方法:

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void set(String key, Object value, Long time){
        redisTemplate.opsForValue().set(key,  value, time, TimeUnit.SECONDS);
    }

    public Object get(String key){
        return redisTemplate.opsForValue().get(key);
    }

}
Spring Boot 中的 RedisTemplate 是一个用于操作 Redis 数据库的高级模板类。它提供了一组方法,可以方便地执行常见的 Redis 操作,如存储、检索和删除数据。 使用 RedisTemplate 需要先配置 Redis 的连接信息,包括主机、端口、密码等。可以通过在 application.properties(或 application.yml)文件中设置相应的属性来配置 Redis 连接信息。 接下来,可以通过自动装配的方式将 RedisTemplate 注入到需要使用 Redis 的类中。然后就可以使用 RedisTemplate 的方法来执行对应的 Redis 操作了,比如: - 存储数据:可以使用 opsForValue() 方法来获取 ValueOperations 对象,然后通过 set() 方法存储键值对。 - 检索数据:可以使用 opsForValue() 方法来获取 ValueOperations 对象,然后通过 get() 方法检索键对应的值。 - 删除数据:可以使用 delete() 方法删除指定的键。 除了上述常见操作外,RedisTemplate 还提供了其他一些方法,例如对列表、集合、有序集合等数据结构进行操作的方法。 需要注意的是,RedisTemplate 是一个泛型类,可以通过设置泛型参数来指定键和值的类型。默认情况下,键和值都被序列化为字节数组进行存储,但也可以自定义序列化器来支持其他类型的对象。 总之,RedisTemplate 提供了一种方便、简洁的方式来操作 Redis 数据库,使得在 Spring Boot 项目中使用 Redis 变得更加容易和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值