SpringData是Spring中数据操作的模块,包含是spring对各种数据库操作的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis。
打开官网,可以发现在 SpringData
下就有各种各样的操作,这些常见的数据库操作全部都属于 SpringData
这个模块,Spring Data Redis
就是其中之一,它里面封装的当然就是对redis的各种各样的操作。
可以发现它的版本也已经迭代版本非常多了。
- Branch:表示 Spring Data Redis 的分支版本,例如 3.2.x、3.1.x 等。
- Initial Release:表示该分支版本的初始发布日期。
- End of Support:表示该分支版本的支持结束日期,即社区或开源支持的结束日期。
- **End Commercial Support **:表示该分支版本的商业支持结束日期,通常是由提供商业支持服务的公司(例如 Pivotal 或 VMware)提供的。星号()可能表示有额外的注释或条件,具体解释可能会在页面底部或者文档的其他部分提供。
但是整体使用上差异并不是很大。
那它具备什么特征呢?首先spring重来不会重复去造轮子,它都是集成,因此它其实是对其他redis客户端的整合(spring不能说抄袭)。
- 提供了对不同Redis客户端的整合(Lettuce和Jedis),并且要整合,就应该提供一套统一的标准
- 提供了RedisTemplate统一API来操作Redis,底层的实现就是由Lettuce和Jedis来实现的
在封装的基础上,它还做了很多很多的支持
-
支持Redis的发布订阅模型
-
支持Redis哨兵和Redis集群
-
支持基于Lettuce的响应式编程(可以结合Spring的WebFlux)
-
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 序列化:将JDK、JSON、字符串、Spring对象这些变成字符串或字节。
- 反序列化:将redis中读到的字节再变成Java中的对象 / 字符串。
对比:在上节Jedis代码中,
set()方法
中 key 和 value 类型都是字符串类型,要么是字节数组(之前讲过,Redis底层编码都是字节数组,无非就是编码格式不一样)。但假设我现在有一个Java对象需要存储,此时它就做不到了,除非你手动给它做序列化,变成字符串或字节。 -
支持基于Redis的JDKCollection实现
JDKCollection:JDK中各种各样的结合,它基于redis重新实现了一下这些集合(队列、链表等)。
为什么要重新实现呢?因为基于redis的实现是分布式的,即跨系统的。
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的API。
Jedis中方法名就是命令名称,redis中有上百个命令,那么Jedis类中就封装了上百个方法,它的好处是学习成本低,但是类相对来讲就比较臃肿了,里面东西特别多。
但是这些API的封装是有规律的,它跟Jedis不同。我们知道,Redis官方也对Redis命令做了分组,例如有通用命令、有专门操作字符串的命令、专门操作hash的命令…
而我们的RedisTemplate它也做了这些事,它的内部提供了一系列的API,它也将不同数据类型的API封装到了不同的类型中,这些API的名字都叫做opsFor,它的返回值都是Operations对象,这些对象中就封装了各种操作:
RedisTemplate 本身封装的就是一些通用的命令。