博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-redis序列化
阅读量:4183 次
发布时间:2019-05-26

本文共 4666 字,大约阅读时间需要 15 分钟。

 

(一)spring data redis 提供了多种可选择策略(RedisSerializer)

  • JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。
  •  
  • StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
  •  
  • JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】
  •  
  • OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】

 

(出自: )

 

 

 spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。sdr提供了4种内置的serializer:

  • JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
  • StringRedisSerializer:字符串编码,数据以string存储
  • JacksonJsonRedisSerializer:json格式存储
  • OxmSerializer:xml格式存储

    其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。

    RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:

    1) keySerializer :对于普通K-V操作时,key采取的序列化策略

    2) valueSerializer:value采取的序列化策略
    3) hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
    4) hashValueSerializer:hash-value的序列化策略

    无论如何,建议key/hashKey采用StringRedisSerializer。

    接下来,通过实例描述如何使用它们,可以首先参考“”:

 

取自:

 

 

(二)尝试其中三种

 

 
  1. @Bean

  2. public RedisTemplate<String, Object> jdkRedisTemplate(

  3. RedisConnectionFactory factory) {

  4. RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();

  5. template.setConnectionFactory(factory);

  6.  
  7. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

  8. ObjectMapper om = new ObjectMapper();

  9. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

  10. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

  11. jackson2JsonRedisSerializer.setObjectMapper(om);

  12.  
  13. JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();

  14.  
  15. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

  16.  
  17. template.setValueSerializer(jdkSerializationRedisSerializer);

  18. template.setKeySerializer(stringRedisSerializer);

  19.  
  20. template.setHashKeySerializer(stringRedisSerializer);

  21. template.setHashValueSerializer(jdkSerializationRedisSerializer);

  22.  
  23. template.afterPropertiesSet();

  24. return template;

  25. }

 

 
  1. @Resource(name = "jdkRedisTemplate") // if stringRedisTemplate, result in SmsCheck cannot be cast to java.lang.String

  2. private RedisTemplate<String, Object> jdkRedisTemplate;

 

 
  1. @RequestMapping(value = "testRedis", method = RequestMethod.POST)

  2. @ResponseBody

  3. @ApiImplicitParams({})

  4. @ApiOperation(value="testRedis")

  5. public Object testRedis() {

  6.  
  7. SmsCheck smsCheck = new SmsCheck();

  8. smsCheck.setMobile("xxx");

  9.  
  10. // 设置缓存

  11. jdkRedisTemplate.opsForValue().set("test",smsCheck);

  12.  
  13.  
  14. return null;

  15. }

 

 
  1. @Entity

  2. public class SmsCheck implements Serializable {

  3. private static final long serialVersionUID = 1L;

  4.  
  5. @Id

  6. @GeneratedValue(strategy = GenerationType.AUTO)

  7. @Column(name = "sms_check_id")

  8. private int smsCheckId;

  9.  
  10. private String mobile;

  11.  
  12. 。。。。。。

 

仅对value操作,保持key为string序列化

 

1.jdk序列化方案

 

get test 显示

 

"\xac\xed\x00\x05sr\x00\x1ecom.ilex.xxx.model.SmsCheck\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x05I\x00\nsmsCheckIdL\x00\acontentt\x00\x12Ljava/lang/String;L\x00\ncreateDatet\x00\x10Ljava/util/Date;L\x00\x06mobileq\x00~\x00\x01L\x00\x04typeq\x00~\x00\x01xp\x00\x00\x00\x00ppt\x00\x03xxxp"

 

注意:若这里的SmsCheck未实现Serializable接口,会抛出一个异常

 

 

 

2.string

 

直接抛出异常

 

SmsCheck cannot be cast to java.lang.String

 

 

 

3 json

 

"[\"com.xxx.xx.model.SmsCheck\",{\"smsCheckId\":0,\"mobile\":\"xxx\",\"type\":null,\"content\":null,\"createDate\":null}]"

 

 

 

然后将key的序列化改为jdk

1) "\xac\xed\x00\x05t\x00\x04test"

2) "test"

 

显示key也被jdk序列化了

 

 

 

redistemplate 默认用jdk序列化key和value

stringredistemplate默认用string序列化key和value

 

 

(三)关于序列化后redis视图主要参考此贴:

 

 

最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了。

我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate和StringRedisTemplate

他们两者之间的区别,以及该怎么使用。

 

RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类

是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似

那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?

其实他们两者之间的区别主要在于他们使用的序列化类。

RedisTemplate使用的是JdkSerializationRedisSerializer

StringRedisTemplate使用的是StringRedisSerializer

 

RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组

然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式

展现的,而是以字节数组显示,类似下面

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的

数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据

 

 

 

 

 

(四)另外:

 

spring-data-redis是对jedis的封装,如果直接使用jedis,需手动

1序列化对象

2转为json字符串

使用,spring自动处理了

 

jedis操作:

你可能感兴趣的文章
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
vue项目打包后无法运行报错空白页面
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
在C++中如何实现模板函数的外部调用
查看>>