我想缓存用户数据及其帐户数据。两者的密钥都是用户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 ...." );
}
======= 我当前面临的问题是,它会覆盖数据,因为用户和帐户之间的键是相同的。任何帮助都很棒
答案 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;
}