本地存储静态数据



我目前有200行键->value,values,其中一个键有两个值。尽管我只使用第一个值。

我想知道如何处理这一问题,是否使用json文件来存储所有这些数据,并将其转换为map<字符串,列表>或者我是否可以创建一个枚举类来存储所有这些?

我只是不知道如何解决这个

由于只有200个条目,所以您有很多选择。

1.只需将其存储在哈希映射中即可

优点:

  • 尽可能简单。O(1(抬头

缺点:

  • 如果有多个线程对此进行了更改,那么就麻烦了

  • 订单将不会保留

  • TTL 无规定

2.将其存储在LinkedHashMap中

与Hashmap相同,但订单将保留

3.将其存储在ConcurrentHashmap中

与Hashmap相同,除了这个可以使用,即使多个线程试图改变它

4.将其储存在咖啡因缓存中

您可以设置TTL

5.将其存储在EHCache中

您可以设置TTL。准备存储在OffHeap主内存中。提供溢出到磁盘

上述所有方法都在利用主内存。它将为您提供最高的读取性能。不用说,这一切都是短暂的,只要你关掉机器,它就会消失。另一方面,在运行时,如果您想对其进行变异并在重新启动时保持变异,则可能需要研究更持久的存储。

由于这是一个键值查找,您可以在应用程序启动时使用static块或@PostConstruct注释方法或Constructer来填充它。或者,如果您处于春季启动阶段,您可以利用@Configuration注释的类和@Value注释的Map<字符串,对象>成员变量与属性/yaml文件结合使用,在该文件中您拥有所有数据并将其注入

关于2个值

如果你确信,你将只得到2个值,我会把它改为类型类,例如

class Values {
Value left;
Value right;
}

而不是列表,毕竟它是一个强类型语言程序

假设数据需要持久化。

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 jar

最新更新