【问题标题】:loadCache() and localLoadCache() and the logic inside cache's storing dataloadCache() 和 localLoadCache() 以及缓存中存储数据的逻辑
【发布时间】:2017-01-02 00:00:04
【问题描述】:

这几天我做了一些关于loadCache、localLoadCache和从缓存中查询数据的实验。然而,我越来越不解了。这是我的谜题。如果您知道如何解释,请帮助我。

  1. loadCache 和 localLoadCache 有什么区别?
  2. 缓存中存储数据的逻辑是什么?例如,我启动了一个名为''A'的节点,它的缓存存储了DB 中Person 表中的一些数据(假设10 项)。然后在代码中,我让它每 5 秒从缓存中查询一次数据。 然后我启动一个名为“B”的新节点,它的缓存存储了DB 中的 Person 表中的 20 个其他项目数据,并让它每 5 秒从缓存中查询数据。但是,为什么从‘A’和‘B’查询数据是30条数据(10+20之和)?

  3. 如果我让B将一个新的item数据放入缓存,然后'A'也能查询出新数据?当我关闭B,然后A 查询出10 项数据,这意味着它与第一个相同。为什么?

【问题讨论】:

    标签: caching persistent-storage ignite


    【解决方案1】:

    Ignite 是一种分布式数据存储。它对您的数据集进行分区,并将其平均分布在可用节点上。例如,如果您有 30 个条目和 2 个节点,则每个节点上大约有 15 个条目。所有权由 Ignite 自动定义,您无法决定将特定条目存储在何处(嗯,您可以,但这很重要)。

    话虽如此,当一个表被加载到缓存中时,它被视为单个数据集。当你从缓存中获取一个条目时,无论它存储在哪里,它都会被透明地返回。

    至于加载,过程如下:

    1. 每个节点独立地从数据库中获取整个表并遍历行。
    2. CacheStore 实现为每一行创建键和值对象并将它们传递到缓存。
    3. 缓存决定这个特定的键值对是否属于本地节点。如果是,则保存。如果不是,则将其丢弃。
    4. 因此,表将以分布式方式完全存储在集群中,每个节点都有自己的数据子集。

    localLoadCache 方法仅在本地节点上执行此过程(在某些特定情况下有用)。 loadCache 基本上只是广播闭包并在所有节点上调用localLoadCache 的快捷方式,因此它会触发分布式数据加载。

    【讨论】:

    • 感谢您的耐心和善意。 1.缓存如何决定特定的键值对是否属于本地节点?用一些算法? 2.如你所说,loadCache会触发分布式数据加载。那么localLoadCache会触发分布式数据加载吗?
    • 1.默认情况下使用随机散列算法:en.wikipedia.org/wiki/Rendezvous_hashing。 2. localLoadCache 仅在本地加载。但通常只在一个节点上加载是没有意义的,因为您不会加载整个表。该方法适用于用户出于某种原因想要手动触发所有节点上的进程的情况。
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2012-11-07
    相关资源
    最近更新 更多