代码之家  ›  专栏  ›  技术社区  ›  kellanburket

点燃具有不同亲和键的缓存之间的搭配

  •  0
  • kellanburket  · 技术社区  · 6 年前

    假设我有两张桌子,分别放在Ignite缓存中, A B 使用相应的键:

    case class AKey(
        @(QuerySqlField@field) id: Long,
        @(AffinityKeyMapped@field)
        @(QuerySqlField@field) parentId: Long
    )
    
    case class BKey(
        @(AffinityKeyMapped@field)
        @(QuerySqlField@field) aId: Long
    )
    

    哪里 A.parentId 是表中另一项的自引用 B.aId A.id .

    如果我想要全部 A. 具有相同 parentId 要搭配,但我也要全部 引用的 A. 父ID B ? 或者这是不可能的?

    从Ignite的文档中,我不清楚Ignite如何在表之间建立关联关系。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Stanislav Lukyanov    6 年前

    Ignite如何管理亲和力搭配

    Ignite并没有真正建立任何“亲和力关系”。它所做的只是将缓存键映射到关联键。所有缓存中具有相同相似性密钥的所有条目都保证并置。

    class KeyA { int a1; int a2; @AffinityKeyMapped int affKey; }
    class KeyB { int b1; int b2; @AffinityKeyMapped int affKey; }
    

    这里我们说 KeyA KeyB 通过 affKey -当 阿夫基 匹配,则条目将并置。但事实上,Ignite不知道这两者之间的联系 凯亚 钥匙 ,它分别处理这些表。只有保证关联密钥到节点的映射是一致的,才能实现这一点。换言之,这些隐藏物之间的关系只存在于我们的头脑中,我们有责任确保它们的搭配是正确的。

    解决方案

    最后,关于你的情况。这可能会令人惊讶,但parentId并不是亲和力密钥的理想候选项。假设我们有三个值

    { id: 1, parentId: 0 }
    { id: 2, parentId: 1 }
    { id: 3, parentId: 2 }
    

    parentId 值-因此,有三个不同的关联键,没有搭配。

    要正确处理这个问题,必须提供一些 groupdId 这保证在所有值中都是相同的。在您的情况下,一个自然的匹配是“树”中根元素的ID。然后 集体行动 将是 @AffinityKeyMapped .

    { id: 1, parentId: 0, groupId: 1 }
    { id: 2, parentId: 1, groupId: 1 }
    { id: 3, parentId: 2, groupId: 1 }
    

    不幸的是,第二个缓存必须引用与affinity key完全相同的值,如果不将其作为字段添加,则无法执行此操作。

    { aId: 2, aGroupId: 1 }
    

    此外,尽管它与问题没有直接关系,但请确保 是缓存的一部分 钥匙 ,而不是值的一部分-否则,它将被忽略。