【SpringBoot实战专题】「开发实战系列」从零开始教你

2023-01-11 00:00:00 数据 操作 对象 类型 序列化

SpringBoot快速操作Redis数据

在SpringBoot框架中提供了spring-boot-starter->针对于不同的版本有了不同的底层客户端的支持的底层客户端框架是不同的:目前常见的客户端为Jedis和Lettuce。

低版本SpringBoot支持的Jedis

Jedis是很常用的Redis的Java 实现的客户端。支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

特点:使用阻塞的 I/O,方法调用同步,程序流需要等到 socket 处理完 I/O 才能执行,不支持异步操作。Jedis 客户端实例不是线程安全的,需要通过连接池来使用 Jedis。

高版本版本SpringBoot支持的Lettuce

Lettuce客户端主要用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

基于 Netty 框架的事件驱动的通信层,其方法调用是异步的。Lettuce 的 API 是线程安全的,所以可以操作单个 Lettuce 连接来完成各种操作。

spring->Spring Boot 的 spring-boot-starter- tid="tid-fJTS4d" style="padding: 0px; margin: 10px 0px; color: rgb(221, 221, 221); font-size: 14px; font-weight: bold; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgba(51, 51, 51, 0.9); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">通用的接口类型工厂方法

提供了对key的“bound”(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key,即BoundKeyOperations:

  • ValueOperations - BoundValueOperations:String类型的简单K-V操作
  • SetOperations - BoundSetOperations:set类型数据操作
  • ZSetOperations - BoundListOperations:zset类型数据操作
  • HashOperations - BoundSetOperations:针对map类型的数据操作
  • ListOperations - BoundHashOperations:针对list类型的数据操作

序列化/反序列化的扩展机制

针对数据的“序列化/反序列化”,提供了多种可选择策略(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工具支持】

Jackson2JsonRedisSerializer

使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。

OxmSerializer

提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率低;不建议使用。【需要spring-oxm模块的支持】

扩展第三方序列化工具

当然了除了以上这几种基本的序列化器之外您还可以进行自定义一些更加、速度更块的序列化方式,例如:FastJsonRedisSerializer和KryoRedisSerializer、FSTRedisSerializer等。

RedisSerializer接口

RedisSerializer 基础接口定义了将对象转换为字节数组(二进制数据)的序列化和反序列化方法。建议将实现设计为在序列化和反序列化端处理空对象/空字节数组。注意,Redis 不接受空键或空值,但可以返回 null(对于不存在的键)。

RedisSerializer 接口方法定义

序列化

序列化方法定义如下:

java

相关文章