概述

RedisTemplate默认使用的是基于JDK的序列化器,所以存储在Redis的数据如果不经过相应的反序列化,看到的结果是这个样子的:

可以看到,出现了乱码,在程序层面上,不会影响程序的运行,但当出现数据错误,对数据进行排查时,就无从下手了。

序列化器

在Spring Data Redis中,用户自定义类型和存储数据之间的转换(反之亦然)由org.springframework.data.redis.serializer包下的类进行处理。

这个包包含两种类型的序列化程序,它们负责序列化过程:

  • 基于RedisSerializer的双向序列化器
  • 通过RedisElementReaderRedisElementWriter进行元素的读写(2.0引进的)

    这两种类型的序列化器主要区别在于,RedisSerializer主要序列化为byte[],RedisElementReader/RedisElementWriter使用ByteBuffer

    基于RedisSerializer的序列化器有多种实现,可以直接使用,如:
  • StringRedisSerializer
  • JdkSerializationRedisSerializer(默认)
  • OxmSerializer(依赖于Spring OXM)
  • Jackson2JsonRedisSerializer/GenericJackson2JsonRedisSerializer(依赖于jackson)

序列化的范围

序列化可以应用到 Key Value HashKey HashValue 上,在 RedisTemplate 中,有四个属于与之对应:

keySerializer valueSerializer hashKeySerializer hashValueSerializer

基于Json的序列化

引入Jackson的maven依赖:

<jackson.databind.version>2.8.5</jackson.databind.version>
<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind.version}</version>
</dependency>

配置序列化器:

<!-- 缓存序列化方式 -->
<!--对key的默认序列化器。默认值是StringSerializer -->
<bean id="stringRedisSerializer"
class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <!--是对value的默认序列化器,默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。 -->
<bean id="genericJackson2JsonRedisSerializer"
class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />

重新配置RedisTemplate:

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer"/>
<property name="hashKeySerializer" ref="stringRedisSerializer"/>
<property name="hashValueSerializer" ref="genericJackson2JsonRedisSerializer" />
</bean>

重新运行上一节的示例,得到如下结果:

示例说明

1. 查看redis的管理工具是:RedisDesktopManager,下载地址:https://redisdesktop.com/download

最新文章

  1. logback配置详解2&lt;appender&gt;
  2. zz剖析为什么在多核多线程程序中要慎用volatile关键字?
  3. Python学习笔记——Day3
  4. 【原】storm源码之理解Storm中Worker、Executor、Task关系
  5. /bin/bash: [xxxx]: command not found
  6. Netbeans8下 Weblogic EJB案例
  7. Scrapy学习系列(一):网页元素查询CSS Selector和XPath Selector
  8. javascript date 加一天(明天)
  9. Android Studio中如何打JAR包
  10. java基础练习 3
  11. line-box(转)
  12. 关于userInteractionEnabled的属性的理解
  13. JavaScript中的this的指代对象详解
  14. 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
  15. nodejs 从部署到域名访问
  16. React中嵌套组件与被嵌套组件的通信
  17. oldboys21day03
  18. Linux 下安装FastDFS v5.08 的php扩展
  19. ajax 简介0
  20. [dts]AM4378的dts中配置和数据手册映射关系

热门文章

  1. python-----从本地摄像头和网络摄像头截取图片
  2. CentOS 6 网络设置修改 指定IP地址 DNS 网关
  3. bzoj 1042: [HAOI2008]硬币购物【dp】
  4. 组合数学练习题(二)——Chemist
  5. Ubuntu 下Python和pip的版本
  6. oracle ORA-01704: string literal too long问题分析
  7. shell脚本从入门到精通
  8. Increasing Sequence CodeForces - 11A
  9. 字符串处理 Codeforces Round #285 (Div. 2) B. Misha and Changing Handles
  10. 题解报告:poj 2299 Ultra-QuickSort(BIT求逆序数)