本文主要介绍对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模板序列化内容,请搜索我们之前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!