我目前有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