Redis中的序列化器

本文介绍了Java中序列化器的作用,详细讲解了在SpringBoot项目中使用Redis的步骤,包括Maven依赖引入、配置Redis连接信息以及更改RedisKey序列化器。通过示例展示了如何在SpringDataRedis中操作不同数据类型并讨论了序列化的重要性。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、什么是序列化器?

二、Redis使用步骤

1.在Maven中引入依赖

2.配置redis的相关信息

三.更改redis key的序列化器



一、什么是序列化器?

在Java中,序列化器主要用于将对象转换为字节流,以便将其存储到文件、数据库或通过网络传输到其他计算机,然后再将字节流反序列化为原始对象。

二、Redis使用步骤

1.在Maven中引入依赖

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

2.配置redis的相关信息

在yml配种文件中 配置redis的相关信息

spring:
  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    password: ${sky.redis.password}
    database: ${sky.redis.database}

3.进行测试

package com.sky.test;

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.*;

import java.util.concurrent.TimeUnit;

/**
 * @author: Administrator
 * @description: TODO
 * @date: 2023/8/22 10:48
 */
@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisTemplate(){
        System.out.println(redisTemplate);
        //string数据操作
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //hash类型的数据操作
        HashOperations hashOperations = redisTemplate.opsForHash();
        //list类型的数据操作
        ListOperations listOperations = redisTemplate.opsForList();
        //set类型数据操作
        SetOperations setOperations = redisTemplate.opsForSet();
        //zset类型数据操作
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }

    @Test
    public void redisTemplateTest(){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        System.out.println(valueOperations);
        System.out.println(hashOperations);
        System.out.println(listOperations);
        System.out.println(setOperations);
        System.out.println(zSetOperations);
    }



    /**
     * 操作字符串类型的数据
     */

    @Test
    public void testString(){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("name","hasaki");
        System.out.println(valueOperations.get("name"));
        valueOperations.set("age",15,30,TimeUnit.SECONDS);
        System.out.println(valueOperations.get("age"));
        Boolean b = valueOperations.setIfAbsent("name", "李四");
        System.out.println(b);
        Boolean b1 = valueOperations.setIfAbsent("gender", "男");
        System.out.println(b1);
        Object object = valueOperations.get("gender");
        System.out.println(object);
    }
}

通过图形化界面,我们能观察到,key和value都是被序列化的

为什么要使用序列化呢,任何存储都需要使用序列化,使用序列化也是一种加密,能够保证数据的安全,还能方便数据的传输,redis是在内存来操作数据的,它的效率比较高,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)

 接下来我们通过观察源码来更改key的序列化,通常value我们需要加密,而key的话不需要使用java自带的序列化器

从这张图我们可以观察到RedisTemplate 实现了RedisAccessor,而RedisAccessor又实现了InitializingBean,在InitializingBean只有一个方法,子类重写了这个方法,在里面会创建序列化器 

三.更改redis key的序列化器

package com.sky.config;

import lombok.extern.slf4j.Slf4j;
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.StringRedisSerializer;

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

### 配置 Gson 作为 Redis序列化器 在 Java 应用中使用 Redis 时,为了提升可读性和跨语言兼容性,通常会采用 JSON 格式进行数据的序列化与反序列化。`Gson` 是 Google 提供的一个用于处理 JSON 的开源库,能够方便地将 Java 对象转换为 JSON 字符串,反之亦然。 #### 自定义 Redis 序列化策略 Spring Data Redis 提供了 `RedisSerializer` 接口,允许开发者自定义序列化方式。要使用 `Gson` 作为 Redis序列化器,可以通过实现该接口来完成配置。 以下是一个基于 `Gson` 实现的 `RedisSerializer` 示例: ```java public class GsonRedisSerializer implements RedisSerializer<Object> { private final Class<?> type; private final Gson gson = new Gson(); public GsonRedisSerializer(Class<?> type) { this.type = type; } @Override public byte[] serialize(Object o) throws SerializationException { if (o == null) { return new byte[0]; } return gson.toJson(o).getBytes(StandardCharsets.UTF_8); } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length == 0) { return null; } String json = new String(bytes, StandardCharsets.UTF_8); return gson.fromJson(json, type); } } ``` #### 在 Spring 配置中使用 GsonRedisSerializer 在 Spring 配置类中,可以将上述自定义的 `RedisSerializer` 设置到 `RedisTemplate` 中,以确保写入和读取数据时使用 `Gson` 进行序列化和反序列化: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GsonRedisSerializer(Person.class)); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GsonRedisSerializer(Person.class)); template.afterPropertiesSet(); return template; } } ``` 通过上述配置,当操作 Redis 数据结构(如 `ValueOperations`、`HashOperations`)时,Java 对象会被自动转换为 JSON 字符串并存储至 Redis 中,从 Redis 中读取数据时也会自动反序列化为对应的 Java 类型。 #### 性能与兼容性考虑 虽然 `Gson` 提供了良好的易用性,但在高并发场景下可能不如 Jackson 等库性能优越。因此,在选择序列化工具时,需要根据实际业务需求权衡可读性、开发效率和运行效率。此外,若多个服务共享同一个 Redis 实例且依赖于特定的数据格式,则必须确保所有服务都支持相同的序列化协议[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值