福州网站建设免费咨询,免费下载微信并安装,命令删除wordpress 缓存,wordpress上传大图文章目录RedisSerializer为什么要使用如何使用RedisSerializer总结RedisSerializer
为什么要使用
RedisTemplate 有默认的序列化器#xff0c;但默认使用的 JdkSerializationRedisSerializer 存在一些问题#xff1a;
序列化后的数据包含类信息等额外内容#xff0c;导致…
文章目录RedisSerializer为什么要使用如何使用RedisSerializer总结RedisSerializer
为什么要使用
RedisTemplate 有默认的序列化器但默认使用的 JdkSerializationRedisSerializer 存在一些问题
序列化后的数据包含类信息等额外内容导致存储的数据体积较大生成的是二进制数据在 Redis 客户端中查看时可读性差
RedisTemplate 是操作 Redis 的主体而 RedisSerializer 是 RedisTemplate 中负责数据格式转换的关键组件。正确配置序列化器可以让 Redis 存储的数据更高效、更易读、更具兼容性
首先看一下RedisTemplate的部分源码
这四个引用默认为空当afterPropertiesSet方法进行判断时为空的话默认创建一个jdk的序列化器这就是后面我们会调用的类
现在我们使用这个对象的set方法通过debug方式看看它怎么运行 当我们点击set方法 会将传入的key和value传入rawKey和rawValue当我们点入rawKey 这里的逻辑有点绕可能大家会想我明明没有设置序列化器为什么还是走else
其实不是 这里我们可以看到如果我们不定义序列化器他会把上面的afterPropertiesSet方法初始化的JdkSerializationRedisSerializer给keySerializer后续我们所调用的序列化器就有了默认的序列化器
小插曲:大家知道为什么会调用afterPropertiesSet方法吗
还是源码 当一个 Bean 实现了 InitializingBean 接口后Spring 容器在完成该 Bean 的所有属性注入即调用完所有 setter 方法后会自动调用接口中的 afterPropertiesSet() 方法。
书接上回经过一系列的赋值和调用这里会判断是否已经自己定义序列化器如果没有且我们自己将key给序列化了——不是自动的
比如我自己将user:100序列化了这样redis就能直接存储原始的二进制不需要再进行序列化转换
虽然我们没有设定序列化器但我们有默认的且没有手动将字符串序列化所以我们走else 点击serialize() 如果是debug的形式我们会进入这个类——熟悉吗上面初始化的类 点击convert() 点击serializeToByteArray() 这里我们可以看到通过ObjectOutputStream类将java对象转成字节 最后会在redis中以这样的方式存储 如何使用RedisSerializer
引入依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId
/dependencyConfiguration
public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplateString, Object template new RedisTemplate();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer serializer new GenericJackson2JsonRedisSerializer();// 设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化template.setValueSerializer(serializer);template.setHashValueSerializer(serializer);// 返回return template;}}这里实际上就是将我们之前提到的几个引用为null的引用进行赋值从而改变序列化器改变reids中存储的内容
SpringBootTest
class SpringdataredisDemoApplicationTests {Resourceprivate RedisTemplate redisTemplate;Testvoid testString() {redisTemplate.opsForValue().set(name, 虎哥);// 从redis中获取nameObject name redisTemplate.opsForValue().get(name);System.out.println(name: name);}
}总结
本篇博客介绍了有关RedisTemplate中的RedisSerializer关于为什么要用已经如何使用如果有什么不正确或比较片面的地方还望指正谢谢大家!!!