我想将键值对存储在数据库中,其中key是一个整数列表或一组整数。
我的用例具有以下步骤
如果DB中不存在整数列表(或整数集),我需要执行某些计算,如果有,那么我只想传递值并避免计算。
我正在考虑将数据保存在键值存储中,但我希望键专门是列表或整数集。
我已经考虑过以下选项
选项A
为整数列表生成唯一的哈希并将其作为键存储在键/值存储中
问题: 我将遇到哈希冲突,这将破坏我的用例。我相信没有办法在100%的时间内生成具有唯一性的哈希。
这不起作用。
如果有足够的机会生成唯一的哈希(100%),那么这是最好的方法。
选项B
使用整数列表或整数集创建一个不可变的类,并将其存储为我的键值存储区的键。
请分享实现需求的任何可行方法。
答案 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万条记录中查找映射。
如果您有任何建议可以加快运行速度,并希望它运行多快,请分享。
我尚不确定创建,更新和删除性能。