如何使用 spring cacheble 在 Hazelcast 缓存映射上设置 TTL
How to set TTL on Hazelcast cache map with spring cacheble
我在 spring 启动时使用 Hazelcast 集群缓存。我使用的是 4.2 版的 hazelcast。
缓存工作正常,但它不会在 TTL 后从缓存映射中逐出数据。始终保持相同的数据。我尝试了很多设置ttl的方法,但都没有成功。
这是我的机会配置class
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.spring.cache.HazelcastCacheManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
@Value("${hazelcast.cluster-name}")
private String hzClusterName;
@Value("${hazelcast.address}")
private String hzAddress;
@Bean
HazelcastInstance hazelcastInstance() {
return HazelcastClient.newHazelcastClient(clientConfig());
}
@Bean
public ClientConfig clientConfig() {
ClientConfig cfg = ClientConfig.load();
cfg.setClusterName(hzClusterName);
cfg.getNetworkConfig().addAddress(hzAddress);
return cfg;
}
@Bean
public CacheManager cacheManager() {
return new HazelcastCacheManager(hazelcastInstance());
}
}
缓存 class 我正在使用 cacheable
@Cacheable("items")
public String getInfo(String systemSkuRef) {
logger.debug("Not using cache, fetch and put in cache");
return "Item Info";
}
我尝试通过设置
在 src/main/resources 中使用 hazelcast.yaml 文件
hazelcast:
network:
public-address:
cluster-name: dev
map:
items:
time-to-live-seconds: 120
max-idle-seconds: 60
eviction:
eviction-policy: LRU
max-size-policy: PER_NODE
size: 1000
有没有其他方法或者我怎样才能做到这一点,感谢您的帮助
您可以在两种拓扑结构中使用 Hazelcast:嵌入式和客户端-服务器。您的 Java Spring 配置配置 Hazelcast 客户端,但是您的 hazelcast.yaml
专用于嵌入式模式。
尝试在 Hazelcast 服务器中使用您的 hazelcast.yaml
配置。或者在 Hazelcast 客户端中配置您的缓存,例如,像这样:
@Bean
HazelcastInstance hazelcastInstance() {
HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig());
instance.getConfig().addMapConfig(new MapConfig("items").setTimeToLiveSeconds(120));
return instance;
}
我在 spring 启动时使用 Hazelcast 集群缓存。我使用的是 4.2 版的 hazelcast。
缓存工作正常,但它不会在 TTL 后从缓存映射中逐出数据。始终保持相同的数据。我尝试了很多设置ttl的方法,但都没有成功。
这是我的机会配置class
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.spring.cache.HazelcastCacheManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
@Value("${hazelcast.cluster-name}")
private String hzClusterName;
@Value("${hazelcast.address}")
private String hzAddress;
@Bean
HazelcastInstance hazelcastInstance() {
return HazelcastClient.newHazelcastClient(clientConfig());
}
@Bean
public ClientConfig clientConfig() {
ClientConfig cfg = ClientConfig.load();
cfg.setClusterName(hzClusterName);
cfg.getNetworkConfig().addAddress(hzAddress);
return cfg;
}
@Bean
public CacheManager cacheManager() {
return new HazelcastCacheManager(hazelcastInstance());
}
}
缓存 class 我正在使用 cacheable
@Cacheable("items")
public String getInfo(String systemSkuRef) {
logger.debug("Not using cache, fetch and put in cache");
return "Item Info";
}
我尝试通过设置
在 src/main/resources 中使用 hazelcast.yaml 文件hazelcast:
network:
public-address:
cluster-name: dev
map:
items:
time-to-live-seconds: 120
max-idle-seconds: 60
eviction:
eviction-policy: LRU
max-size-policy: PER_NODE
size: 1000
有没有其他方法或者我怎样才能做到这一点,感谢您的帮助
您可以在两种拓扑结构中使用 Hazelcast:嵌入式和客户端-服务器。您的 Java Spring 配置配置 Hazelcast 客户端,但是您的 hazelcast.yaml
专用于嵌入式模式。
尝试在 Hazelcast 服务器中使用您的 hazelcast.yaml
配置。或者在 Hazelcast 客户端中配置您的缓存,例如,像这样:
@Bean
HazelcastInstance hazelcastInstance() {
HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig());
instance.getConfig().addMapConfig(new MapConfig("items").setTimeToLiveSeconds(120));
return instance;
}