【发布时间】:2020-10-20 14:05:51
【问题描述】:
我目前有 200 行 key -> value, values,其中一个键有两个值。即使我只使用第一个值。
我想知道如何处理这个问题,是否使用 json 文件来存储所有这些数据并将其转换为 map
我只是不知道如何解决这个问题
【问题讨论】:
我目前有 200 行 key -> value, values,其中一个键有两个值。即使我只使用第一个值。
我想知道如何处理这个问题,是否使用 json 文件来存储所有这些数据并将其转换为 map
我只是不知道如何解决这个问题
【问题讨论】:
因为它只有 200 个条目,所以您有很多选择。
1.只需将其存储在 Hashmap 中即可。
优点:
缺点:
如果你有多个线程改变这个,你就是在自找麻烦
订单不会被保留
不提供 TTL
2。将其存储在 LinkedHashMap 中
与 Hashmap 相同,但会保留 Order
3.将其存储在 ConcurrentHashmap 中
与 Hashmap 相同,除了这个可以使用,即使多个线程尝试对其进行变异
4.将其存储在 CaffeineCache 中
你可以设置TTL
5.存储在 EHCache 中
您可以设置 TTL。提供存储在 OffHeap 主内存中。提供溢出到磁盘
上述所有方法都在利用主内存。它将为您提供最高的读取性能。不用说,这一切都是短暂的,只要你关闭机器,它就会消失。另一方面,在运行时,如果您想对其进行变异并在重新启动时保持变异,您可能需要研究更持久的存储。
由于它是键值查找,您可以在应用启动时使用 关于 2 个值 如果您确定,您将只获得 2 个值,例如,我会将其更改为类型化类 而不是列表,毕竟它是一个强类型语言程序static 块或@PostConstruct 带注释的方法或构造函数来填充它。或者,如果您在 spring-boot 领域,您可以利用 @Configuration 带注释的类和 @Value 带注释的 Mapclass Values {
Value left;
Value right;
}
【讨论】:
@Configuration注释并且成员变量Map使用@Value注释
假设数据需要持久化。
MapDB 在 java 中对此类需求非常有用。这可用于存储任何可序列化的类型。
地图可以直接存储在文件中并检索。 它嵌入了对事务的支持。
import org.mapdb.DB;
import org.mapdb.DBMaker;
private DB mapDb;
private ConcurrentMap<String, LinkedHashSet> translationMap;
@PostConstruct
private void init() {
log.info("Map db Start initiated...");
mapDb = DBMaker
.fileDB(new File(nosqlDbPath))
.fileMmapEnable()
.transactionEnable()
.make();
translationMap = (ConcurrentMap<String, LinkedHashSet>) mapDb.hashMap("map").createOrOpen();
log.info("Map db Start completed.");
}
@PreDestroy
private void close() {
log.info("Map db shutdown initiated...");
mapDb.commit();
mapDb.close();
log.info("Map db shutdown complete.");
}
translationMap 将保存启动时的所有数据。
别忘了添加 MapDB jars
【讨论】: