列表作为钥匙值存储的键



我想将密钥值对存储在数据库中,其中键是整数列表或一组整数。

我拥有以下步骤的用例

  1. 我将获得整数列表
  2. 我需要检查DB
  3. 中是否已经存在该整数列表(作为键(
  4. 如果存在,我需要从db
  5. 中获取值

如果整数(或整数(列表在DB中还没有,我需要执行某些计算。>

我正在考虑将数据保存在钥匙值存储中,但我希望密钥专门为列表或整个整数。

我已经考虑了以下选项

选项

为整数列表生成一个唯一的哈希,并将其存储在键/值存储中

问题:我将发生哈希碰撞,这会破坏我的用例。我相信没有办法有100%的时间来产生哈希。

这将行不通。

如果有远处生成唯一的哈希(100%(,那是最好的方法。

选项B

创建一个带有整数或整数列表的不变类,并将其存储为我的钥匙值存储的关键。

请分享达到需求的任何可行方法。

您无需做任何特别的事情:

Map<List<Integer>, String> keyValueStore = new HashMap<>();
List<Integer> key = Arrays.asList(1, 2, 3);
keyValueStore.put(key, "foo");

所有JDK Collections实现了仅基于列表内容的equals()hashCode()

谢谢。我想分享更多的发现。

我现在尝试了以下我在较早文章中提到的内容。

我在mongodb中添加了以下文档

db.products.insertMany([
{
    mapping: [1, 2,3],
    hashKey:'ABC123',
    date: Date()
},
{
    mapping: [4, 5],
    hashKey:'ABC45'  ,
    date: Date()
},
{
    mapping: [6, 7,8],
    hashKey:'ABC678' ,
    date: Date()
},
{
    mapping: [9, 10,11],
    hashKey:'ABC91011', 
    date: Date()
},
{
    mapping: [1, 9,10],
    hashKey:'ABC1910',
    date: Date()
},
{
    mapping: [1, 3,4],
    hashKey:'ABC134',
    date: Date()
},
{
    mapping: [4, 5,6],
    hashKey:'ABC456',
    date: Date()
}  
]);

当我现在试图找到映射时,我会得到预期结果

> db.products.find({ mapping: [4,5]}).pretty();
{
    "_id" : ObjectId("5d4640281be52eaf11b25dfc"),
    "mapping" : [
        4,
        5
    ],
    "hashKey" : "ABC45",
    "date" : "Sat Aug 03 2019 19:17:12 GMT-0700 (PDT)"
}

上面给出了正确的结果,因为DB

中存在映射[4,5](保留插入顺序(
> db.products.find({ mapping: [5,4]}).pretty();

上面的结果没有预期的结果,因为映射[5,4]不存在DB中。插入顺序被保留

因此,似乎"映射"作为列表正常工作。

我使用春季数据从本地运行的蒙古多德(MongoDB(读取。

文档的格式为

{
    "_id" : 1,
    "hashKey" : "ABC123",
    "mapping" : [
        1,
        2,
        3
    ],
    "_class" : "com.spring.mongodb.document.Mappings"
}

我使用 org.springframework.boot.commandlinernerner

将170万个记录插入DB中

然后与我上一个示例类似的查询:

db.mappings.find({ mapping: [1,2,3]})

平均需要1.05秒,以查找1.7 m记录的映射。

,如果您有任何建议,请分享它更快的速度,我可以期望它运行的速度。

我尚不确定创建,更新和删除性能。

最新更新