Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Redis中为复杂对象建模_Java_Database_Spring Boot_Caching_Redis - Fatal编程技术网

Java 如何在Redis中为复杂对象建模

Java 如何在Redis中为复杂对象建模,java,database,spring-boot,caching,redis,Java,Database,Spring Boot,Caching,Redis,我希望使用Redis作为复杂数据的缓存。考虑这个例子,我想存储和检索AsStType数据。一个资产类型可以有多个AspectType。因此,AspectType本身是另一个实体。这将有一个多对多的关系 当我想将AssetType存储在缓存中时,我想将AspectType存储在新的缓存中,并以某种方式携带引用。因此,每个AssetType中都没有存储重复的AspectType。 基本上,结构应该是: Cache1: AssetType key: at1, value: {at1, sameple

我希望使用Redis作为复杂数据的缓存。考虑这个例子,我想存储和检索AsStType数据。一个资产类型可以有多个AspectType。因此,AspectType本身是另一个实体。这将有一个多对多的关系

当我想将AssetType存储在缓存中时,我想将AspectType存储在新的缓存中,并以某种方式携带引用。因此,每个AssetType中都没有存储重复的AspectType。 基本上,结构应该是:

Cache1: AssetType
key: at1, value: {at1, sameple description, [referenceTo-asp1, referenceTo-asp2]}
key: at2, value: {at2, sameple description, [referenceTo-asp2, referenceTo-asp3]}

Cache2: AspectType
key: asp1, value: {asp1, sample description}
key: asp2, value: {asp2, sample description}
key: asp3, value: {asp3, sample description}

当我使用JPA通过数据库进行操作时,这是非常容易的。但是,在Redis中有什么有效的方法可以做到这一点吗?

在Redis中有很多有效的方法可以做到这一点。不过,您需要做出一些设计决策

首先,每个资产类型可以有一个哈希类型的键,或者所有资产类型都有一个哈希

每个资产类型的密钥

HSET AssetType:at1 name at1 desc "sample description" aspects "asp1,asp2,asp3"
HSET AssetType:at2 name at2 desc "sample description" aspects "asp1,asp2"
您始终可以使用
扫描0匹配资产类型:
循环浏览资产类型

所有资产类型的一个哈希值,序列化每个资产类型,比如使用JSON:

HSET AssetTypes at1 "{'name':'at1','desc':'sample description','aspects':['asp1','asp2','asp3']}"
HSET AssetTypes at2 "{'name':'at2','desc':'sample description','aspects':['asp1','asp2']}"
同样的决定也适用于AspectTypes。这里的主要权衡是,您可能希望一次检索/更新一个项目的给定字段,或者始终检索/更新整个项目

然后,使用引用的AspectType id检索详细信息

另一个设计决策是将引用与主项一起存储,或者将引用存储在单独的键中。例如,可以使用集合存储对方面的引用:

HSET AssetType:at1 name at1 desc "sample description"
SADD AspectsPerAsset:at1 asp1 asp2 asp3
集合在这里很有用,因为它们只维护唯一的成员,从而简化CRUD操作

例如,这允许您获取两个或多个资产类型的公共方面:

SINTER AspectsPerAsset:at1 AspectsPerAsset:at2 AspectsPerAsset:at3
注意到目前为止,我们已经建立了一对多关系。这是一个例子。在本例中,您还将维护每个方面对资产类型的引用:

HSET AssetType:at2 name at2 desc "sample description"
SADD AspectsPerAsset:at2 asp1 asp2
SADD AssetsPerAspect:asp1 at2
SADD AssetsPerAspect:asp2 at2
这允许您获取给定AspectType的所有资产类型,与
SINTER
共享几个方面的资产类型,或者说具有一组给定AspectType中的一个或多个的资产类型:

SUNION AssetsPerAspect:asp1 AssetsPerAspect:asp2 at2

我试着为你们说明一些模式。根据您的用例的具体情况,可能还有其他更好的方法。

难道不可能使用像H2这样的内存数据库吗?然后你可以使用你的工作JPA解决方案(这不是直接的答案,因为它不是在java中……因为问题不是java相关的,我相信你会得到答案)如果你知道如何用C或C++来编码,那么你可以创建一个简单的ReDIS模块(看起来像一个简单的30-60min任务),它将拥有一个全方位的全局字典,然后在一个键中,它将存储带有指向AspectTypes指针的资产类型。您还可以修改Redis源代码以使用全局字符串字典(我认为他们尝试过这样做,但最终决定不这样做),但同样,这需要您使用C。。。