服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 深入理解 Redis Template及4种序列化方式

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

2021-07-28 16:59小小工匠 Redis

这篇文章主要介绍了深入理解 Redis Template及4种序列化方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

使用spring 提供的 spring data redis 操作redis 必然要使用spring提供的模板类 redistemplate, 今天我们好好的看看这个模板类 。

redistemplate

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

看看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 字符串序列化方式。

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

redisserializer 序列化 接口

redisserializer接口 是 redis 序列化接口,用于 redis key 和 value 的序列化

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

redisserializer 接口的实现类 如下

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

归类一下

  • jdk 序列化方式 (默认)
  • string 序列化方式j
  • son 序列化方式
  • xml 序列化方式

jdk 序列化方式 (默认)

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

我们来看下源码 redistemplate#afterpropertiesset()

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

spring boot 自动化配置 redistemplate bean 对象时,就未设置默认的序列化方式。

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

我们来做个测试

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

运行单元测试

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

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

看不懂呀 ,老哥

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 ,字符串和二进制数组的直接转换

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

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

json 序列化方式

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

?
1
2
3
4
5
6
7
8
9
10
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 ,会在字符串多冗余一个类型,这样反序列化就知道具体的类型了

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

先说个结论

标准json

?
1
2
3
4
5
{
 "id": 100,
 "name": "小工匠",
 "sex": "male"
}

使用 jackson default typing 机制序列化

?
1
2
3
4
5
6
{
 "@class": "com.artisan.domain.artisan",
 "id": 100,
 "name": "小工匠",
 "sex": "male"
}

示例

测试一把

【配置类】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@bean
public 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;
}

【单元测试】

?
1
2
3
4
5
6
7
8
9
@test
public void testjacksonserializer() {
 artisan artisan = new artisan();
 artisan.setname("小工匠");
 artisan.setid(100);
 artisan.setsex("male");
 // set
 redistemplate.opsforvalue().set("artisan", artisan);
}

【结果】

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

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

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

xml 序列化方式

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

到此这篇关于深入理解 redis template及4种序列化方式的文章就介绍到这了,更多相关redis template序列化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

延伸 · 阅读

精彩推荐
  • RedisRedis 6.X Cluster 集群搭建

    Redis 6.X Cluster 集群搭建

    码哥带大家完成在 CentOS 7 中安装 Redis 6.x 教程。在学习 Redis Cluster 集群之前,我们需要先搭建一套集群环境。机器有限,实现目标是一台机器上搭建 6 个节...

    码哥字节15752021-04-07
  • Redis关于Redis数据库入门详细介绍

    关于Redis数据库入门详细介绍

    大家好,本篇文章主要讲的是关于Redis数据库入门详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    沃尔码6982022-01-24
  • RedisRedis集群的5种使用方式,各自优缺点分析

    Redis集群的5种使用方式,各自优缺点分析

    Redis 多副本,采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。...

    优知学院4082021-08-10
  • Redis《面试八股文》之 Redis十六卷

    《面试八股文》之 Redis十六卷

    redis 作为我们最常用的内存数据库,很多地方你都能够发现它的身影,比如说登录信息的存储,分布式锁的使用,其经常被我们当做缓存去使用。...

    moon聊技术8182021-07-26
  • Redisredis缓存存储Session原理机制

    redis缓存存储Session原理机制

    这篇文章主要为大家介绍了redis缓存存储Session原理机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    程序媛张小妍9252021-11-25
  • Redis如何使用Redis锁处理并发问题详解

    如何使用Redis锁处理并发问题详解

    这篇文章主要给大家介绍了关于如何使用Redis锁处理并发问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习...

    haofly4522019-11-26
  • RedisRedis Template实现分布式锁的实例代码

    Redis Template实现分布式锁的实例代码

    这篇文章主要介绍了Redis Template实现分布式锁,需要的朋友可以参考下 ...

    晴天小哥哥2592019-11-18
  • Redis详解三分钟快速搭建分布式高可用的Redis集群

    详解三分钟快速搭建分布式高可用的Redis集群

    这篇文章主要介绍了详解三分钟快速搭建分布式高可用的Redis集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    万猫学社4502021-07-25