深入理解 Redis Template及4种序列化方式

深入理解 Redis Template及4种序列化方式

本文主要介绍对Redis模板的深入理解和四种序列化方法。通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

概述

使用Spring提供的Spring数据redis操作Redis必须使用Spring提供的模板类RedisTemplate。今天,我们就来好好看看这个模板类。

RedisTemplate

看看四个与序列化相关的属性,它们主要用于键和值的序列化。比如,我们经常在Redis中存储POJO对象,一般情况下,我们使用JSON将其序列化为字符串,存储在Redis中。

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

ValueOperations类提供Redis字符串API操作。

ListOperations类提供Redis列表API操作。

SetOperations类,它提供Redis Set API操作。

ZSetOperations类,它提供Redis ZSet(排序集)API操作。

GeoOperations类,提供Redis Geo API操作。

HyperLogLogOperations类,它提供Redis HyperLogLog API操作

StringRedisTemplate

看看常用的StringRedisTemplate。

RedisTemplateK,V支持泛型,StringRedistemplatek和V都是字符串类型。

org . spring framework . data . redis . core . string distencile继承了RedisTemplate类,使用org . spring framework . data . redis . serializer . stringredserializer的字符串序列化。

RedisSerializer 序列化 接口

RedisSerializer接口是一个Redis序列化接口,用于序列化Redis键和值。

RedisSerializer接口的实现类如下

整理一下。

JDK序列化方法(默认)

字符串序列化模式j

子序列化模式

XML序列化模式

JDK 序列化方式 (默认)

org . spring framework . data . redis . serializer . JDK serialization redis ializer。默认情况下,RedisTemplate使用这种数据列方法。

让我们看看源代码redist template # AfterPropertieSet()

当Spring Boot自动配置RedisTemplate Bean对象时,不会设置默认的序列化方法。

在大多数情况下,不建议使用JDKSerialization Redisserializer进行序列化。主要是手动查数据不方便。

让我们做一个测试。

运行单元测试

我不明白,兄弟。

KEY前面是一个奇怪的十六进制字符,而VALUE也是一串奇怪的十六进制字符。

为什么是这么奇怪的十六进制字符串?输出流# writestring(string string,boolean unshared)实际上是标志位字符串长度字符串内容。

当键这样序列化的时候,通过键在线查询对应的值是非常不方便的,所以键一定不能这样序列化。

值是这样序列化的,只是可能有点难读,而且不支持跨语言。其实一直没还OK。但实际在线场景中,多使用JSON序列化。

String 序列化方式

org . spring framework . data . redis . serializer . stringredserializer,字符串和二进制数组之间的直接转换

在大多数情况下,我们的键和值将使用这种序列化方案。

JSON 序列化方式

org . spring framework . data . redis . serializer . generic jackson 2 jsonredisserializer使用Jackson实现JSON的序列化,从通用词可以看出,它支持所有的类。

public generic Jackson 2 jsonredisserializer(@ Nullable String class property typename){

.

.

if(string utils . hastext(class property typename)){

mapper . enabledefaulttypingasproperty(DefaultTyping。NON_FINAL,class property typename);

}否则{

mapper . enabledefaulttyping(DefaultTyping。非最终版本。物业);

}

}

如果classPropertyTypeName不为空,则对应于传入对象的classPropertyTypeName属性的值将用作默认类型。否则,传入对象的完整类名将用作默认类型。

让我们考虑一下。将对象序列化为字符串时,如何确保字符串被反序列化为对象的类型?使用Jackson默认类型,字符串中多一个类型将是多余的,这样反序列化将知道具体的类型。

我先做个结论。

标准JSON

{

id: 100,

姓名:小工匠,

性别:男性

}

使用Jackson默认类型机制的序列化

{

@ class : com . artisan . domain . artisan ,

id: 100,

姓名:小工匠,

性别:男性

}

例子

一个测试。

[配置类]

@Bean

public RedisTemplateString,Object redisTemplate() {

//创建RedisTemplate对象

RedisTemplateString,Object template=new redis template();

//设置RedisConnection工厂。它是实现访问多个Java Redis客户端的秘密工厂。

template.setConnectionFactory(连接工厂);

//使用字符串序列化来序列化密钥。

template . setkeyserializer(redis erializer . string());

//使用JSON序列化对值进行序列化(库是Jackson)。

template . setvalueserializer(redis erializer . JSON());

返回模板;

}

[单元测试]

@测试

public void testJacksonSerializer(){

Artisan Artisan=new Artisan();

Artisan.setName(小工匠);

artisan . setid(100);

artisan.setSex(男性);

//设置

redisTemplate.opsForValue()。集(匠,匠);

}

【结果】

是否有更多的@class属性,这样就可以从这里得到反序列化对象的类型?

@class属性看似完美解决了反序列化的对象类型,但却导致了较大的JSON字符串占用,所以我们在实际项目中很少使用Jackson2JsonRedisSerializer。

XML 序列化方式

Org。Spring framework . data . redis . serializer . oxm serializer使用Spring OXM实现对象和字符串之间的转换,从而实现字符串和二进制数组之间的转换。之前没见过用的项目,就不啰嗦了。

关于深入理解Redis模板和四种序列化方法的文章到此结束。更多相关Redis模板序列化内容,请搜索我们之前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

深入理解 Redis Template及4种序列化方式