spring-boot - 如果在类中添加手动 CacheManager,Hazelcast 缓存不起作用
问题描述
Hazelcast 配置在 spring boot 中(嵌入式 hazelcast 一个)
@Bean
CacheManager hazelcastCacheManager() {
return new HazelcastCacheManager(Hazelcast.newHazelcastInstance());
}
@Bean
public Config hazelCastConfig() {
Config cacheConfig = new Config().setInstanceName("cache-instance");
MapConfig userCache = new MapConfig().setName("users")
.setMaxSizeConfig(new MaxSizeConfig(500, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
.setTimeToLiveSeconds(12);
cacheConfig.addMapConfig(userCache);
}
当我在服务层使用 @Cacheable 时,它工作正常(它在 12 秒后从缓存中删除密钥)
@Cacheable(key = "#name", value = "users")
但是,一旦我将 CacheManager 添加到同一个服务类。这个缓存值永远不会被删除(超过一个)。我的最终要求是使用缓存管理器来获取缓存并检查该值是否存在。(在第二次尝试后阻止用户并在 12 秒后允许。因此,缓存会将其存储 12 秒,我可以检查是否不在缓存中,继续,否则通知等待)
import org.springframework.cache.CacheManager;
@Autowired
private CacheManager cacheManager;
@Override
public void doCachingOperation() throws InterruptedException {
Cache userCache = cacheManager.getCache("users");
System.out.println(CalendarUtils.getCurrentDate());
userCache.put("Satish", 1);
System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));
Thread.sleep(2000);
System.out.println("2 sec passed");
System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));
Thread.sleep(14000);
System.out.println("16 sec passed");
System.out.println(CalendarUtils.getCurrentDate());
System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));
}
现在,这个值在 16 秒后仍然可用,而它应该在 12 秒后用键“Satish”删除。
解决方案
而不是在没有任何配置的情况下创建新实例,
Hazelcast.newHazelcastInstance()
您应该自动连接HazelcastInstance
,让 spring boot 使用hazelCastConfig()
bean 创建实例。
@Autowired
private HazelcastInstance hazelcastInstance;
@Bean
CacheManager hazelcastCacheManager() {
return new HazelcastCacheManager(hazelcastInstance);
}
@Bean
public Config hazelCastConfig() {
Config cacheConfig = new Config().setInstanceName("cache-instance");
MapConfig userCache = new MapConfig().setName("users")
.setMaxSizeConfig(new MaxSizeConfig(500, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
.setTimeToLiveSeconds(12);
cacheConfig.addMapConfig(userCache);
}
推荐阅读
- jquery - 与 angularjs 动态数据一起使用时 Jquery 数据表重新加载问题
- r - 基于组创建新列并使用基于其他组的总和填充这些列
- python - Python - 从excel列列表创建多个文件夹
- r - 保持在 ggplot 图表中用作 X 的定性变量的原始顺序
- azure-ad-b2c - AADB2C90077:用户没有现有会话并且请求提示参数的值为“无”。2
- javascript - 并行边缘检测/处理根本不适用于 mxGraph
- azure - 缩放 Azure 容器实例
- c++ - 格式化表格看起来不错
- ruby-on-rails - CSV::Row 和 Hash 导航不起作用 Ruby 2.3.3 Rails 5.1
- json - 在 Swift 中使用 Gloss 解析 JSON 数组