文章目录

  • 概述
  • RedisTemplate
  • StringRedisTemplate
  • RedisSerializer 序列化 接口
    • JDK 序列化方式 (默认)
    • String 序列化方式
    • JSON 序列化方式
      • 示例
    • XML 序列化方式


概述

使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 。


RedisTemplate

看看4个序列化相关的属性 ,主要是 用于 KEY 和 VALUE 的序列化 。 举个例子,比如说我们经常会将POJO 对象存储到 Redis 中,一般情况下会使用 JSON 方式序列化成字符串,存储到 Redis 中 。

Spring提供的Redis数据结构的操作类

  • ValueOperations 类,提供 Redis String API 操作
  • ListOperations 类,提供 Redis List API 操作
  • SetOperations 类,提供 Redis Set API 操作
  • ZSetOperations 类,提供 Redis ZSet(Sorted Set) API 操作
  • GeoOperations 类,提供 Redis Geo API 操作
  • HyperLogLogOperations 类,提供 Redis HyperLogLog API 操作

StringRedisTemplate

再看个常用的 StringRedisTemplate

RedisTemplate<K, V> 支持泛型,StringRedisTemplate K V 均为String类型。

org.springframework.data.redis.core.StringRedisTemplate 继承 RedisTemplate 类,使用 org.springframework.data.redis.serializer.StringRedisSerializer 字符串序列化方式。


RedisSerializer 序列化 接口

RedisSerializer接口 是 Redis 序列化接口,用于 Redis KEY 和 VALUE 的序列化

RedisSerializer 接口的实现类 如下

归类一下

  • JDK 序列化方式 (默认)
  • String 序列化方式
  • JSON 序列化方式
  • XML 序列化方式

JDK 序列化方式 (默认)

org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ,默认情况下,RedisTemplate 使用该数据列化方式。

我们来看下源码 RedisTemplate#afterPropertiesSet()

Spring Boot 自动化配置 RedisTemplate Bean 对象时,就未设置默认的序列化方式。

绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化。主要是不方便人工排查数据。

我们来做个测试

运行单元测试

看不懂呀 ,老哥

KEY 前面带着奇怪的 16 进制字符 , VALUE 也是一串奇怪的 16 进制字符 。。。。。

为什么是这样一串奇怪的 16 进制? ObjectOutputStream#writeString(String str, boolean unshared) 实际就是标志位 + 字符串长度 + 字符串内容

KEY 被序列化成这样,线上通过 KEY 去查询对应的 VALUE非常不方便,所以 KEY 肯定是不能被这样序列化的。

VALUE 被序列化成这样,除了阅读可能困难一点,不支持跨语言外,实际上也没还OK。不过,实际线上场景,还是使用 JSON 序列化居多。


String 序列化方式

org.springframework.data.redis.serializer.StringRedisSerializer ,字符串和二进制数组的直接转换


绝大多数情况下,我们 KEY 和 VALUE 都会使用这种序列化方案。


JSON 序列化方式

org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer 使用 Jackson 实现 JSON 的序列化方式,并且从 Generic 单词可以看出,是支持所有类。

public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {.......... if (StringUtils.hasText(classPropertyTypeName)) {mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);} else {mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);}}

classPropertyTypeName 不为空的话,使用传入对象的 classPropertyTypeName 属性对应的值,作为默认类型(Default Typing) ,否则使用传入对象的类全名,作为默认类型(Default Typing)。

我们来思考下,在将一个对象序列化成一个字符串,怎么保证字符串反序列化成对象的类型呢?Jackson 通过 Default Typing ,会在字符串多冗余一个类型,这样反序列化就知道具体的类型了

先说个结论

  • 标准JSON
{"id": 100,"name": "小工匠","sex": "Male"
}
  • 使用 Jackson Default Typing 机制序列化
{"@class": "com.artisan.domain.Artisan","id": 100,"name": "小工匠","sex": "Male"
}

示例

测试一把

【配置类】

    @Beanpublic RedisTemplate<String, Object> redisTemplate() {// 创建 RedisTemplate 对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置 RedisConnection 工厂。 它就是实现多种 Java Redis 客户端接入的秘密工厂template.setConnectionFactory(connectionFactory);// 使用 String 序列化方式,序列化 KEY 。template.setKeySerializer(RedisSerializer.string());// 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。template.setValueSerializer(RedisSerializer.json());return template;}

【单元测试】

   @Testpublic void testJacksonSerializer() {Artisan artisan  = new Artisan();artisan.setName("小工匠");artisan.setId(100);artisan.setSex("Male");// setredisTemplate.opsForValue().set("artisan", artisan);}

【结果】

是不是多了@class 属性,反序列化的对象的类型就可以从这里获取到。

@class 属性看似完美解决了反序列化后的对象类型,但是带来 JSON 字符串占用变大,所以实际项目中,我们很少采用 Jackson2JsonRedisSerializer


XML 序列化方式

org.springframework.data.redis.serializer.OxmSerializer使用 Spring OXM 实现将对象和 String 的转换,从而 String 和二进制数组的转换。 没见过哪个项目用过,不啰嗦了

Redis - RedisTemplate及4种序列化方式深入解读相关推荐

  1. Springboot下RedisTemplate的两种序列化方式

    一.定义一个配置类,自定义RedisTemplate的序列化方式 @Configuration public class RedisConfig {@Beanpublic RedisTemplate& ...

  2. 深入理解 Redis Template及4种序列化方式__spring boot整合redis实现RedisTemplate三分钟快速入门

    概述 使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 . RedisTem ...

  3. Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑

    前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...

  4. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  5. android对象序列化的方法,Android 进阶-两种序列化方式 Serializable 和 Parcelable

    [导读]序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态 ...

  6. springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    文章目录 一.redisTemplate和stringRedisTemplate对比 1.StringRedisTemplate 2.RedisTemplate 二.redisTemplate序列化方 ...

  7. Redis集群两种配置方式

    2019独角兽企业重金招聘Python工程师标准>>> 第一种使用:JedisCluster <bean id="jedisPoolConfig" clas ...

  8. Redis 锁的几种实现方式

    1. redis加锁分类 redis能用的的加锁命令分别是 INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再 ...

  9. 三种序列化方式性能比较

    一下代码比较了二进制序列化.xml序列化.Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢 using System; using System.Collect ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——宏
  2. 普通程序员如何逆袭,达到财富自由?
  3. 参考使用CSDN-markdown编辑器以及复杂表格编辑
  4. OpenCASCADE:OCCT应用框架OCAF之TObj模型辅助类和包装
  5. python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...
  6. impala简介(大数据技术)
  7. Github|类别不平衡学习资源(上)
  8. [Error]SyntaxError: unindent does not match any outer indentation level
  9. 新博开通,近期将推出系列博客之测试工具篇!
  10. 分布式监控报警平台Centreon之:Centreon简介
  11. Discuz X3.4版块规则支持html代码修改
  12. 图像处理之matlab中fspecial函数用法详解
  13. Xp计算机同步时间,xp电脑时间无法同步如何解决
  14. 域名解析、域名转向的作用
  15. iphone无法更新app_如何在移动连接上进行iPhone Weather App更新
  16. 自动化学报latex模板下载
  17. java验证手机号格式方法
  18. SSD固态硬盘 4K对齐
  19. android+饭否+开源,饭否Android客户端推荐:有饭
  20. JVM的三种垃圾回收算法

热门文章

  1. C++输入输出类的层次
  2. 因子分解机 Factorization Machine python 源码
  3. Python 面向对象 编程(一)
  4. FCN全连接卷积网络(4)--Fully Convolutional Networks for Semantic Segmentation阅读(引言部分)
  5. python 笔记 size-constrained-clustering (对类别大小做限制的聚类问题)
  6. MATLAB应用实战系列(七十七)-基于长时间序列栅格数据的MK检验
  7. MATLAB从入门到精通系列之几个实用小技巧
  8. 朴素贝叶斯(NaiveBayes)算法总结
  9. matlab 实现多维作图函数(slice)
  10. MATLAB基本操作(三):数据类型