可通过键值访问的复杂集合的外部存储

时间:2011-06-14 20:51:03

标签: caching map nosql redis key-value

问题

我需要一个可以存储以下格式值的键值存储:

DS<DS<E>>
  

数据结构DS可以是哪里   ListSortedSetArray

     

E可以是Stringbyte-array

生成这些数据非常昂贵,因此一旦我将其放入商店,我将只对其执行读取查询。本质上,它是一个复杂的对象缓存,没有驱逐。

示例应用

应用程序的一个(可能很糟,但足以澄清)示例是从文档中存储标记化的句子,您需要能够快速访问 pth语句的 qth word 给定documentID。在这种情况下,我将它存储为K-V对,如下所示:

K - docID
V - List<List<String>>
String word = map.get(docID).get(p).get(q);

我更喜欢避免应用集成的Map解决方案(例如Java中的EhCache)。

我使用过Redis但它似乎不支持第二层数据结构的复杂性。任何其他可以帮助我使用案例的K-V解决方案?


更新

我知道我可以序列化/反序列化我的对象,但我想知道是否还有其他解决方案。

3 个答案:

答案 0 :(得分:2)

就平台选择而言,您有两个选择 - 完整文档数据库将支持任意复杂的对象,但不具有用于处理特定数据结构的内置命令。像Redis这样的具有特定数据结构优化代码的东西不能支持所有可能的数据结构。

通过使用id而不是嵌套数据结构,您实际上可以与Redis非常接近。 DS1<DS2<E>>变为DS1<int>DS2<E>int来自DS1,前缀为您提供密钥DS2

使用此结构,您只需两次操作即可访问任何E。在某些情况下,您可以通过了解给定查询的DS2 ID来将其归结为单个操作。

答案 1 :(得分:1)

我毫不犹豫地“推荐”它,但我所知道的唯一一个有效处理这种多维数据的存储引擎是Intersystems Cache。我不得不在我上一份工作中使用它,主要使用它基于MUMPS的语言编写它。除非你讨厌自己或你的开发人员,否则我不会推荐原生方法。但是,它们确实具有不错的Java适配器,这似乎是您正在使用的。我已经看到它处理数十亿条记录,有效地存储在嵌套的二进制树表中。您可以使用的深度(尺寸数)没有实际限制。但是,这是一个非常专有的解决方案。有一个名为GT.M的开源替代方案,但我不知道它与非M或C语言的兼容性。

答案 2 :(得分:0)

任何键值存储都支持复杂的值,您只需要序列化/反序列化数据。

如果只想快速检索数据的特定部分,可以使用更复杂的密钥。在您的示例中,这将是:     K - 元组(docID,p,q)