有没有办法在多个缓存之间使用一种Hazelcast配置?

时间:2019-04-18 13:06:54

标签: caching hazelcast

我想缓存用户数据及其帐户数据。两者的密钥都是用户ID。

我想知道如何使用一个Hazelcast配置在用户数据和帐户数据之间实现缓存?或

我应该使用两个单独的Hazelcast实例

config.addMapConfig(
       new MapConfig()
        .setName("CS_DATA")
        .setMaxSizeConfig(new 
                  MaxSizeConfig(Integer.parseInt(cacheSize),                                                        
                  MaxSizeConfig.MaxSizePolicy.valueOf(cachePolicy)))
        .setEvictionPolicy(EvictionPolicy.LRU)                                    
        .setTimeToLiveSeconds(Integer.parseInt(cacheTTL)));
        return config;
    }

=============

@Cacheable(value = "CS_DATA", key = "#userName" , condition = "#root.target.isAccountCacheRequired()")
public Object getAccounts(String userName) {
            log.info("Cache miss for Accounts data.....Calling otlClient ...." );

=============

@Cacheable(value =CS_DATA, key = "#userName", condition = "#root.target.isUserCacheRequired()")

public User getUser(String userName) {
   log.info("Cache miss for UserData.....Calling otlClient ...." );
  }

======= 我当前面临的问题是,它会覆盖数据,因为用户和帐户之间的键是相同的。任何帮助都很棒

1 个答案:

答案 0 :(得分:1)

您的数据将被覆盖,因为您在两个Cacheable批注中使用了相同的缓存名称(均表示spring应该以名称CS_DATA写入缓存)。

您应确保为每种不同的缓存类型使用单独的缓存(Hazelcast IMap)(假设getAccounts的返回类型不是User对象,而是getUser的大小写)。例如,您可以注释这样的可缓存方法,以将CS_ACCOUNT IMap用于缓存帐户,并将单独的CS_USER IMap用于User对象:

@Cacheable(value = "CS_ACCOUNT", key = "#userName" , condition = "#root.target.isAccountCacheRequired()")
public Object getAccounts(String userName) {
            ...
}

@Cacheable(value = "CS_USER", key = "#userName", condition = "#root.target.isUserCacheRequired()")
public User getUser(String userName) {
   ...
}

如果您要使用不同的配置来配置两个单独的IMap,则可以在Hazelcast MapConfig中使用两个单独的Config,如下所示:

public Config getConfig() {
  config.addMapConfig(
    new MapConfig()
      .setName("CS_ACCOUNT")
      .setMaxSizeConfig(new MaxSizeConfig(Integer.parseInt(cacheSize),                                                        
                  MaxSizeConfig.MaxSizePolicy.valueOf(cachePolicy)))
      .setEvictionPolicy(EvictionPolicy.LRU)                                    
      .setTimeToLiveSeconds(Integer.parseInt(cacheTTL)));
  // add another map config for CS_USER IMap
  config.addMapConfig(
    new MapConfig()
      .setName("CS_USER")
      .setMaxSizeConfig(new MaxSizeConfig(Integer.parseInt(userCacheSize),                                                        
                  MaxSizeConfig.MaxSizePolicy.valueOf(cachePolicy)))
      .setEvictionPolicy(EvictionPolicy.LRU)                                    
      .setTimeToLiveSeconds(Integer.parseInt(userCacheTTL)));

  return config;
}

如果您希望多个IMap共享通用配置,则可以使用wildcards in configuration。例如,为了使以IMap开头的所有CS_共享相同的配置,请像这样使用CS_*作为MapConfig中的映射名称:

public Config getConfig() {
  // all IMaps with name starting with CS_ will share same max size config, eviction policy and TTL
  config.addMapConfig(
    new MapConfig()
      .setName("CS_*")
      .setMaxSizeConfig(new MaxSizeConfig(Integer.parseInt(cacheSize),                                                        
                  MaxSizeConfig.MaxSizePolicy.valueOf(cachePolicy)))
      .setEvictionPolicy(EvictionPolicy.LRU)                                    
      .setTimeToLiveSeconds(Integer.parseInt(cacheTTL)));
  return config;
}