【问题标题】:Storing static data locally本地存储静态数据
【发布时间】:2020-10-20 14:05:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: java json spring


    【解决方案1】:

    因为它只有 200 个条目,所以您有很多选择。

    1.只需将其存储在 Hashmap 中即可。

    优点:

    • 尽可能简单。 O(1) 查找

    缺点:

    • 如果你有多个线程改变这个,你就是在自找麻烦

    • 订单不会被保留

    • 不提供 TTL

    2。将其存储在 LinkedHashMap 中

    与 Hashmap 相同,但会保留 Order

    3.将其存储在 ConcurrentHashmap 中

    与 Hashmap 相同,除了这个可以使用,即使多个线程尝试对其进行变异

    4.将其存储在 CaffeineCache 中

    你可以设置TTL

    5.存储在 EHCache 中

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

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

    由于它是键值查找,您可以在应用启动时使用static 块或@PostConstruct 带注释的方法或构造函数来填充它。或者,如果您在 spring-boot 领域,您可以利用 @Configuration 带注释的类和 @Value 带注释的 Map 成员变量与您拥有所有数据并注入的属性/yaml 文件

    关于 2 个值

    如果您确定,您将只获得 2 个值,例如,我会将其更改为类型化类

    class Values {
     Value left;
     Value right;
    }
    

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

    【讨论】:

    • 您不认为拥有 200 个值的地图会很疯狂,哈哈?而且我必须对初始化进行硬编码,对吗?此外,无需担心并发性或顺序或任何您认为将它放在枚举中可能会更好吗?
    • 你将如何在枚举中做到这一点?我想不出如何用枚举来做,如果你有示例代码,请把它贴在这里。不,我不认为 200 个条目很疯狂,但是如果您担心它,请从属性文件中加载它。或者从 consul/eureka/etcd/zookeeper 等其他配置服务加载它,或者从数据库加载。
    • 哦,你不能吗?我只是假设你可能会。您将如何使用属性文件?你需要一个模型类来加载它吗?
    • @Spider,是的,你需要模型类。如果您使用的是spring boot,它将自动为您注入,如果您的类使用@Configuration注释并且成员变量Map使用@Value注释
    【解决方案2】:

    假设数据需要持久化。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2013-10-15
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2016-03-31
      相关资源
      最近更新 更多