问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis为什么要序列化

发布网友 发布时间:2023-07-30 20:19

我来回答

1个回答

热心网友 时间:2024-11-29 13:00



序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。 (推荐学习:Redis视频教程)
通过上面我想你已经知道了凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化。
本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。
redis序列化方式对比:
redis的默认方式是JdkSerializationRedisSerializer
JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。
优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。
Jackson2JsonRedisSerializer: 使用Jackson库将对象序列化为JSON字符串。
优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。
但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。
问题:使用默认的JDK序列化方式,在RDM工具中查看k-v值时会出现“乱码”,不方便查看。
解决:自定义系列化方式,使用Jackson2JsonRedisSerializer
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置
*
* @author LinJie
*/
@Configuration
public class RedisConfig {
/**
* Redis repository redis repository.
*
* @param redisTemplate the redis template
* @return the redis repository
*/
@Bean
public RedisRepository redisRepository(RedisTemplate redisTemplate) {
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return new RedisRepository(redisTemplate);
}
}更多Redis相关技术文章,请访问Redis数据库使用入门教程栏目进行学习!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 java 代码中跑出来这句话什么意思 redis序列化方式哪几种 以下关于数据仓库的叙述中,( )是正确的。 以下关于数据仓库的描述中,正确的是___。 梦见接吻表示什么的预兆 雅顿21天显效面霜批号 OFF1,请问保质Ɯ 雅顿21天显效霜适合什么肤质使用 真的有吸脂的蚊子吗??? 2022年情人节2月14日的来历 情人节可以送玫瑰吗 门东30在屋里放20天还能用吗 上海万向区块链股份公司是专精特新企业吗? 2016湖北二级建造师合格标准什么时候公布 专升本档案状态如何在网上查询? 梦见别人骂母亲丑 梦见相爱许久的女朋友骂我臭 梦见肚子上鸡冠一样东西? 23年211分数线 今年什么时候入伏天出伏天 今年什么时间出伏 出伏天是哪一天2023 员工病假期间工资怎么算:员工连续请病假 劳动法短期病假怎么规定 科目二边距30cm有什么技巧? 科目二喵不好30公分边线怎么办 请问哈尔滨西到冰雪大世界多远,哈尔滨西到冰雪大世界怎么走 哈尔滨火车西站到哈尔滨冰雪大世界怎么走 哈尔滨西站到冰雪大世界有没有直达车 哈尔滨西站到冰雪大世界应坐几路公交车,详细说!! 哈尔滨西站到冰雪大世界 从哈尔滨冰雪大世界到哈尔滨西站好打车吗 Ubuntu进入超级用户之后没办法访问根文件 深圳的朋友,我想去现场参加深圳电视台录制的《论道》节目,具体地点和时 ... 一秒借钱借贷额度高不高? N. W. G. W的区别是什么? ppttmp文件可以删除吗 为什么从百度上下载软件安装时,偷偷安装百度卫士、百度杀毒?还有其他... ...里下载了游戏的安装包,结果发现百度还偷偷下载了百度手机助手的安装... 石头g10s可水洗滤网装哪里 东_射频是做什么的? word2010中删除表格的方法是将整个表格选定