Spring数据的用途及其抽象级别是什么?

Spring数据的用途及其抽象级别是什么?,spring,spring-data,spring-data-gemfire,spring-data-redis,Spring,Spring Data,Spring Data Gemfire,Spring Data Redis,在试图理解“Spring数据”的用途时,我遇到了这篇文章,并尝试了Gemfire/Redis存储库及其相应的Spring数据组件的几个示例。有人能帮我回答以下问题吗 场景: 当GemFire是我的数据存储时,我必须使用GemFireTemplate上的方法创建、获取和删除来执行CRUD操作。 当Redis是我的数据存储时,我必须在RedisTemplate上使用.opsForHash().put、.opsForHash().get和.opsForHash().delete方法来执行相同的CRUD

在试图理解“Spring数据”的用途时,我遇到了这篇文章,并尝试了Gemfire/Redis存储库及其相应的Spring数据组件的几个示例。有人能帮我回答以下问题吗

场景: 当GemFire是我的数据存储时,我必须使用GemFireTemplate上的方法创建、获取和删除来执行CRUD操作。 当Redis是我的数据存储时,我必须在RedisTemplate上使用.opsForHash().put、.opsForHash().get和.opsForHash().delete方法来执行相同的CRUD操作

问题

Spring数据不应该为数据提供一个抽象级别吗 底层数据存储?如果我想知道各自的积垢 方法和具有基于底层数据存储的不同API, Spring数据组件带来了什么样的抽象?不能 我直接使用Jedis或Java客户端为Gemfire执行这些操作 数据存储特定CRUD操作

似乎可以解释,但是,看起来我需要一些帮助来理解它


所有持久性存储都没有通用API。差别太大了。但是Spring数据项目确实提供了一个通用的编程模型来访问您的数据

Spring数据确实提供了对底层数据存储的抽象级别。然而,NoSQL存储是一个非常多样化的领域,一个是图形数据库,另一个是专门用于存储文档的,第三个是用于存储键值对等。尽管如此,这些并不是您想要抽象掉的差异,这些是您首先选择它们的独特功能

另一方面,Spring数据为您提供了一致性,以及针对这些不同存储应用已知模式的方法

  • 它为您提供了一种配置访问存储的资源的方法
  • 底层类型和Java类型之间的映射和转换
  • 大多数存储的存储库抽象,归结为只声明基本CRUD操作的接口。实现和特定于存储的内容由Spring数据处理
  • 专用于提供用于访问本机API的回调的模板实现

这个名单还有很多。关键是Spring数据确实尽可能地提供了一个抽象级别,但它也没有将公开的功能限制在一个最不知名的公分母上,因为这会剥夺不同存储的好处。

谢谢你的提问,正如主从机已经很好地指出了Spring数据 提供的功能是多种多样的,但有时在存储模块之间支持的功能方面存在功能差异。那些是 部分原因是特定底层数据存储的不同特征和功能以及重点和时间限制

Redis和Gemfire在某种程度上扩展了类似的存储技术,提供了一种关键价值,如存储和访问模型。然而,Gemfire提供了比Redis更丰富的查询功能。这就是原因之一 Spring Data Gemfire已经有相当一段时间了

另一方面,Redis是一个不同的故事——正如主从式所提到的,您可以轻松地构建自己的定制Redis存储库——这就是它的意义所在 很多人都会这样做,但通常与Redis的交互对于用例来说是非常独特的,所以我们没有看到 如此多的功能重叠促使通用实现不仅仅是“保存”和“加载”


我们有一个为SpringDataRedis添加存储库抽象的方法,但我们还没有时间去做

使用Spring模板进行特定于数据存储的访问(例如GemfireTemplate)的许多优点之一是,它们使开发人员免受模板通常围绕的底层数据存储API更改的影响。如果数据存储供应商对API接口进行了破坏性更改(GemFire就是这种情况),则模板可以在不更改用户应用程序的情况下为底层API提供一层抽象/自适应

此外,该模板还可以利用其他Spring基础架构管理(如事务),这些事务通常不会内置到底层数据存储API中。模板还可以为底层数据存储产品中的几个不同API提供方便的外观和层

例如,GemfireTemplate封装了“获取”和“放置”数据以及“查询”感兴趣的数据的操作

要在GemFire中执行前者,您需要执行以下操作

Region<String, SomeValue> example = gemfireCache.getRegion("/Example");

example.put("someKey", new SomeValue(..));
...
SomeValue someValue = example.get("someKey");
和询问

SelectResults<SomeValue> results = gemfireTemplate.find("SELECT * FROM /Example WHERE ...", args);

// process the query results
SelectResults=gemfireTemplate.find(“SELECT*FROM/Example WHERE…”,args);
//处理查询结果
如果发生异常,或无法收集结果,则GemFires的异常/错误将统一映射到,这是另一个优势,它使切换底层数据存储更容易,同时具有一致的事务处理

最后,虽然ThomasDarimont和Master-Slave都很好地总结了使用的优点,但这并不是一个新概念

在Spring数据存储库抽象的表现力和便利性出现之前,应用程序开发人员将使用DAO模式从应用程序服务层抽象出CRUD和其他数据访问操作(例如查询)

然而,Spring数据给您的是这样做的能力:只需为允许的数据访问操作声明契约(一个Java接口),Spring数据(包括特定于提供者的实现,如Spring Data GemFire)就可以处理其余部分,插入特定于数据存储的“默认”实现
gemfireTemplate.put("someKey", new SomeValue(..));
...
SomeValue someValule = gemfireTemplate.get("someKey");
SelectResults<SomeValue> results = gemfireTemplate.find("SELECT * FROM /Example WHERE ...", args);

// process the query results