非Web Java应用实现Hazelcast缓存,确保重启后Map数据不丢失
Hazelcast嵌入式缓存本地持久化实现方案
针对非Web Java应用的缓存需求,可直接使用Hazelcast自带的Map持久化能力实现磁盘落地,重启后缓存数据不丢失,具体实现步骤如下:
1. 引入Hazelcast核心依赖
以Maven为例,在pom.xml中添加依赖:
<dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> <version>5.3.2</version> <!-- 可替换为最新稳定版 --> </dependency>
2. 配置持久化规则
这里使用代码配置方式,无需额外配置文件,适配main方法启动场景:
- 指定缓存Map的持久化目录,确保应用对该目录有读写权限
- 开启Map的持久化开关,支持启动时自动从磁盘加载原有数据
import com.hazelcast.config.*; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.map.IMap; public class HazelcastCacheDemo { public static void main(String[] args) { // 配置Hazelcast实例 Config config = new Config(); config.setInstanceName("local-cache-instance"); // 配置本地持久化规则 PersistenceConfig persistenceConfig = new PersistenceConfig(); persistenceConfig.setEnabled(true); persistenceConfig.setBaseDir("./hazelcast-persistence"); // 自定义本地持久化存储路径 config.setPersistenceConfig(persistenceConfig); // 启动Hazelcast实例 HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config); IMap<Long, String> dataMap = hzInstance.getMap("data"); // 业务逻辑 Long targetKey = 1001L; if (dataMap.containsKey(targetKey)) { // 缓存命中,直接读取 String cacheData = dataMap.get(targetKey); System.out.println("命中缓存,数据:" + cacheData); } else { // 缓存未命中,查询DB String dbData = queryDataFromDb(targetKey); // 写入缓存,会自动持久化到磁盘 dataMap.put(targetKey, dbData); System.out.println("查询DB获取数据:" + dbData); } // 应用关闭前调用优雅停机方法,保证数据完整落盘 // hzInstance.shutdown(); } // 模拟DB查询方法 private static String queryDataFromDb(Long key) { return "DB查询返回的数值:" + key; } }
注意事项
- 第一次启动应用后,会自动在当前目录生成
./hazelcast-persistence文件夹存储缓存数据,后续重启应用会自动加载该目录下的原有缓存 - 如果对性能要求较高,可配置写后异步(write-behind) 策略,缓存写入会异步落盘,降低IO阻塞;对数据一致性要求高则使用默认的写穿(write-through) 策略,写入缓存的同时同步落盘
- 不要将持久化目录设置在系统临时目录下,避免系统自动清理导致缓存数据丢失
内容的提问来源于stack exchange,提问作者parantap dansana
相关产品推荐
相关产品推荐

