【问题标题】:Is there a way to use one Hazelcast configuration across multiple cachings?有没有办法在多个缓存中使用一个 Hazelcast 配置?
【发布时间】:2019-04-18 13:06:53
【问题描述】:

我想缓存用户数据及其帐户数据。两者的关键是用户 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 ...." );
  }

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

【问题讨论】:

    标签: caching hazelcast


    【解决方案1】:

    您的数据正在被覆盖,因为您在两个 Cacheable 注释中使用了相同的缓存名称(两者都表明 spring 应该写入名称为 CS_DATA 的缓存)。

    您应该确保为您缓存的每种不同类型使用单独的缓存 (Hazelcast IMaps)(我假设 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) {
       ...
    }
    

    如果你想用不同的配置来配置两个独立的IMaps,你可以像这样在你的 Hazelcast Config 中使用两个独立的MapConfigs:

    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;
    }
    

    如果您希望多个IMaps 共享公共配置,那么您可以使用wildcards in configuration。例如,为了让所有以CS_ 开头的IMaps 共享一个公共配置,请使用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;
    }
    

    【讨论】:

    • 非常感谢。我认为通配符对我来说是最好的方法。
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2020-12-14
    • 2016-10-23
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多