区别
java虚拟机内存和redis内存是两块独立的内存空间,分属于两个不同的进程,不同的两个应用,在网络传输层表现为数据传输是用TCP二进制流进行传输的
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。 而跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
如何序列化和反序列化
反序列化
package com.ghosnplus.config;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
// 默认的key的序列化容器是 JdkSerializationRedisSerialzer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
return redisTemplate;
}
}
序列化
package com.ghosnplus.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 标签实体类
*/
@TableName("tag")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Tag implements Serializable {
private String id;
private String name;
@TableField(exist = false)
private Long totalSize;
}
序列化我们主要通过实体类继承Serializable接口,来实现实体类和redis的数据转换
为什么要序列化和反序列化
主要是防止写入redis内存数据丢失。
Redis持久化的方式:快照、AOF日志
快照RDB(默认)与AOF各自特点:
快照是一次全量备份,AOF日志是连续的增量备份
快照是内存数据的二进制序列化形式,在存储上非常紧凑,而AOF日志记录的是内存数据修改的指令记录文本
AOF日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载AOF日志进行指重放,这个时间就会无比漫长,定期需要对AOF重写,使其瘦身。