列为键值存储的键

时间:2019-08-03 08:00:25

标签: java hash key-value-store

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

我的用例具有以下步骤

  1. 我将得到一个整数列表
  2. 我将需要检查数据库中是否已经存在整数列表(作为键)
  3. 如果存在,我将需要从数据库中获取值

如果DB中不存在整数列表(或整数集),我需要执行某些计算,如果有,那么我只想传递值并避免计算。

我正在考虑将数据保存在键值存储中,但我希望键专门是列表或整数集。

我已经考虑过以下选项

选项A

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

问题: 我将遇到哈希冲突,这将破坏我的用例。我相信没有办法在100%的时间内生成具有唯一性的哈希。

这不起作用。

如果有足够的机会生成唯一的哈希(100%),那么这是最好的方法。

选项B

使用整数列表或整数集创建一个不可变的类,并将其存储为我的键值存储区的键。

请分享实现需求的任何可行方法。

2 个答案:

答案 0 :(得分:2)

您不需要执行任何特殊操作:

Map<List<Integer>, String> keyValueStore = new HashMap<>();

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

所有JDK集合都仅基于列表的内容实现明智的equals()hashCode()

答案 1 :(得分:2)

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

我现在在下面的文章中进一步尝试了以下内容。

我在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)"
}

上面给出的结果是正确的,因为数据库中存在映射[4,5](保留插入顺序)

> db.products.find({ mapping: [5,4]}).pretty();

由于数据库中不存在映射[5,4],因此上面没有给出预期的结果。插入顺序被保留

因此,似乎列表正在按预期方式工作。

我使用Spring Data从本地运行的MongoDB中读取数据。

文档格式为

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

我使用 org.springframework.boot.CommandLineRunner

将170万条记录插入到数据库中

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

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

平均花费1.05秒从170万条记录中查找映射。

如果您有任何建议可以加快运行速度,并希望它运行多快,请分享。

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