Redis序列化和java存入Redis数据序列化反序列化总结

Java代码在保存数据到Redis时需要配置序列化,因为Java内存和Redis内存不同,数据传输需通过TCP二进制流。Java中常用Jackson2JsonRedisSerializer因其高效和可读性优于JdkSerializationRedisSerializer。Redis的持久化包括快照(RDB)和AOF日志,前者是全量备份,后者是增量备份,AOF长期运行后可能庞大,需定期重写。
摘要由CSDN通过智能技术生成

背景:

最近考虑java代码数据在保存redis时,通常要配置序列化,才能保存到redis中,然而我们知道Redis中也有序列化(RDB和AoF两种形式),有点混淆总结一下。

java中数据保存redis过程序列化的原因是什么?

解释:

java虚拟机内存和redis内存是两块独立的内存空间,分属于两个不同的进程,不同的两个应用,在网络传输层表现为数据传输是用TCP二进制流进行传输的

序列化最终的目的是为了对象可以跨平台存储,和进行网络传输 而跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组

java中如何序列化?

package com.gisquest.cloud.oauth2.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(RedisConfiguration.class);

    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public RedisTemplate<Object, Object> redisTemplateOther(RedisConnectionFactory redisConnectionFactory) {
        logger.info("redisProperties - host:[{}], port:[{}]",
                redisProperties.getHost(), redisProperties.getPort());

        RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //使用Jackson2JsonRedisSerializer替换默认的序列化规则
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper=new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        //设置value的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //设置key的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

项目中为什么常用用Jackson2JsonRedisSerializer序列化,而不用JdkSerializationRedisSerializer

Redis客户端存储对象时,需要通过序列化器将对象转化为字符串进行存储。默认情况下对象序列化器使用的是JdkSerializationRedisSerializer,该序列化器将对象转化byte数组进行存储。

由于默认序列化器需要存入对象必须实现Serializable接口,转化效率低及数据可读性差等问题存在,通常大部分项目会改用Jackson2JsonRedisSerializer或FastJsonRedisSerializer将对象转化为json进行序列化及反序列化。
 

redis为什么要持久化(序列化和反序列化)

主要是防止写入redis内存数据丢失。

Redis持久化的方式:快照、AOF日志

快照RDB(默认)与AOF各自特点:
快照是一次全量备份,AOF日志是连续的增量备份
快照是内存数据的二进制序列化形式,在存储上非常紧凑,而AOF日志记录的是内存数据修改的指令记录文本
AOF日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载AOF日志进行指重放,这个时间就会无比漫长,定期需要对AOF重写,使其瘦身。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很高兴帮助你解答问题。以下是Java redis序列化反序列化的示例代码: Redis序列化对象: ``` import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.util.Assert; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class RedisObjectSerializer implements RedisSerializer<Object> { private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; public RedisObjectSerializer() { super(); } public byte[] serialize(Object obj) throws SerializationException { if (obj == null) { return EMPTY_BYTE_ARRAY; } try { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(128); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteStream); objectOutputStream.writeObject(obj); objectOutputStream.flush(); return byteStream.toByteArray(); } catch (Throwable ex) { throw new SerializationException("Failed to serialize", ex); } } public Object deserialize(byte[] bytes) throws SerializationException { if (isEmpty(bytes)) { return null; } try { ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes)); return objectInputStream.readObject(); } catch (Throwable ex) { throw new SerializationException("Failed to deserialize", ex); } } private boolean isEmpty(byte[] data) { return (data == null || data.length == 0); } } ``` Redis反序列化对象: ``` import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.util.Assert; import java.nio.charset.Charset; public class RedisStringSerializer implements RedisSerializer<String> { private final Charset charset; public RedisStringSerializer() { this(Charset.forName("UTF8")); } public RedisStringSerializer(Charset charset) { Assert.notNull(charset, "Charset must not be null!"); this.charset = charset; } public String deserialize(byte[] bytes) { return (bytes == null ? null : new String(bytes, charset)); } public byte[] serialize(String string) throws SerializationException { return (string == null ? null : string.getBytes(charset)); } } ``` 请注意,这里使用了Spring Data Redis库,并实现了RedisSerializer接口。您可以根据需要使用其他Redis客户端库和其他序列化器。希望这可以帮助到您!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值