【问题标题】:Apache Ignite: How to get cached item without affinity keyApache Ignite:如何在没有关联键的情况下获取缓存项目
【发布时间】:2021-09-22 09:36:21
【问题描述】:

我有两个缓存,一个用于 Person,另一个用于 Company 对象,通过指定 Person.Id 作为键,Person.CompanyId 作为关联键。

personCache.Put(new AffinityKey(p1.Id, p1.CompanyId), p1);
companyCache.Put(c1.Id, c1);

是否可以使用 Person.Id 从缓存中获取人员? (没有 Person.CompanyId)?

【问题讨论】:

    标签: c# .net ignite gridgain


    【解决方案1】:

    可以,但不支持 Key-Value API。

    根据定义,Key-Value API 需要一个密钥来访问数据。如果您的密钥是AffinityKey(personId, companyId),那么您必须构造完整的密钥对象才能使用IgniteCache::get 操作。

    但是,还有 SQL API,它是访问相同数据的另一个接口。您可以将缓存声明为启用 SQL 的缓存,并将 personId 声明为该缓存中的 SQL 字段。

    有多种方法可以创建启用 SQL 的缓存:

    • 使用CREATE TABLE 语句创建它(而不是在节点配置中指定它或使用createCache 方法创建)。

    • indexedTypes指定为CacheConfiguration的一部分,并将键值对象的字段注释为@QuerySqlField
      indexedTypes 的问题是您必须将注释放入类中。显然,这不适用于 AffinityKey 类,因为您无法更改它。

    • QueryEntity 指定为CacheConfiguration 的一部分。
      QueryEntity 的问题在于它可能变得相当复杂,而且通常比 @QuerySqlField 注释更难维护。

    在您的情况下,我建议不要使用 AffinityKey 类并创建您自己的版本 - 我们称之为 PersonKey。您可以注释其字段并使用indexedTypes

    下面是一个简短的例子:

    public class SqlFieldInKeyExample {
        static class PersonKey {
            @QuerySqlField
            long personId;
    
            @QuerySqlField
            @AffinityKeyMapped
            long companyId;
    
            public PersonKey(long personId, long companyId) {
                this.personId = personId;
                this.companyId = companyId;
            }
        }
    
        static class Person {
            @QuerySqlField
            String name;
    
            public Person(String name) {
                this.name = name;
            }
        }
    
        public static void main(String[] args) throws IgniteException {
            try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
                CacheConfiguration<PersonKey, Person> cfg = new CacheConfiguration<PersonKey, Person>()
                    .setName("PersonCache")
                    .setIndexedTypes(PersonKey.class, Person.class);
    
                IgniteCache<PersonKey, Person> cache = ignite.createCache(cfg);
    
                cache.put(new PersonKey(9000, 42), new Person("John Doe"));
    
                List<List<?>> result = cache.query(new SqlFieldsQuery("SELECT * FROM PERSON WHERE PERSONID = 9000")).getAll();
                assert result.size() == 1;
                System.out.println(">>>>> Person: " + result.get(0));
            }
        }
    }
    

    输出(除其他外)是:

    >>>>> Person: [9000, 42, John Doe]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多