我想将密钥值对存储在数据库中,其中键是整数列表或一组整数。
我拥有以下步骤的用例
- 我将获得整数列表
- 我需要检查DB 中是否已经存在该整数列表(作为键(
- 如果存在,我需要从db 中获取值
如果整数(或整数(列表在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记录的映射。
,如果您有任何建议,请分享它更快的速度,我可以期望它运行的速度。
我尚不确定创建,更新和删除性能。