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

如何替换点火缓存?

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

    Im正在使用ignite版本 2.2.0 我有以下缓存配置:

    private CacheConfiguration<String, Product> getProductCacheConfiguration() {
        final CacheConfiguration<String, Product> cacheConfiguration = new CacheConfiguration<>(Identifiers.PRODUCT_IGNITE_CACHE);
    
        cacheConfiguration.setName(Identifiers.PRODUCT_IGNITE_CACHE);
        cacheConfiguration.setIndexedTypes(String.class, Product.class);
        cacheConfiguration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
        cacheConfiguration.setCacheStoreFactory(new FactoryBuilder.SingletonFactory<>(new ProductCacheStoreAdapter(this.databaseConfiguration)));
        cacheConfiguration.setReadThrough(true);
        cacheConfiguration.setWriteThrough(true);
        cacheConfiguration.setCopyOnRead(false);
        cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);
        cacheConfiguration.setOnheapCacheEnabled(true);
    
        return cacheConfiguration;
    }
    

    最初,当应用程序(spring应用程序)启动时,我会将数据库中的所有数据加载到ignite缓存中。之后,我启动了一个spring scheduler任务,负责加载新数据和替换旧数据。通过替换我并不意味着替换当前缓存中存在的单个项——我的意思是替换整个缓存——删除所有当前条目并添加所有新的条目。

    这里的问题是,在这个替换过程中,应用程序将不可用,因为我将首先删除所有数据,然后添加新数据。因此,当没有可用的数据时,有一个很小的时间范围。我不想那样。

    有没有一种方法可以在没有数据的时间范围内替换缓存?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Denis Mekhanikov    6 年前

    考虑在Ignite中有两个缓存并在它们之间切换。

    触发计划任务后,可以创建新缓存并开始向其中加载数据。读取进程仍然可以使用旧缓存。加载完成后,可以将读取进程切换到新缓存,然后“清理或销毁旧缓存”。

    不过,你必须自己实现转换。例如,可以使用复制的缓存来存储当前被视为活动的缓存的名称。