【问题标题】:effective way to cache about 8 million records in java在java中缓存大约800万条记录的有效方法
【发布时间】:2018-10-18 08:39:39
【问题描述】:

我有一个 java 的 web 应用程序,我必须缓存大约 800 万条记录,以尽量减少对数据库 (MySql) 的连接请求。处理此问题的有效解决方案是什么?

【问题讨论】:

  • 我不确定 B 从 A 逻辑上遵循
  • 为什么?每个缓存都会引入缓存一致性问题。应用程序端的缓存更是如此,因为所需的机制要么不存在,要么应用程序程序员不太了解。每次我看到应用程序端缓存时,它都会成为问题的根源,而且在大多数情况下不值这个价。

标签: java mysql jsp web


【解决方案1】:

假设您在存储 80lac 记录时没有内存问题。您可以创建两个地图。在第一个地图(我们称之为记录)中,您使用键值对机制存储所有记录。创建第二张地图(我们称之为 CACHED_RECORD)。实现 MRU 算法以将条目存储在 CACHED_RECORD 中。以这种方式实现获取记录的逻辑:

  • 从 CACHED_MAP 查询记录。
  • 如果找到记录,则从 CACHED_MAP 返回记录。
  • 如果记录不存在,则从 RECORDS 获取记录,并使用 MRU 逻辑更新 CACHED_RECORD 中的条目。

MRU逻辑可以参考-https://en.wikipedia.org/wiki/Cache_replacement_policies

另一种方法是根据某些规则/政策(例如:在某个地区以 A 开头的人名)为您的记录编制索引。

虽然,这不是存储 80lac 记录的好方法。您还应该对应用程序的性能进行基准测试。

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    因此,最好的简单做法是获取记录并将其保存在地图中(例如) 如果地图不包含任何记录,请从数据库中获取。 它看起来像

    private List<Records> cachedRecords;
    
    public List<Record> getRecords()
    {
       if (cachedRecords == null)
       cachedRecords = DB.getConnection().getRecords();
    }
    
    return cachedRecords;
    

    更新:您也可以使用 Hibernate,其中存在诸如延迟初始化之类的工具

    【讨论】:

    • 有什么办法让缓存更快?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2012-06-14
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多