Java中用Map实现简单缓存的核心是使用ConcurrentHashMap存储键值对,并添加过期控制(如TTL时间戳校验)和容量限制(如LinkedHashMap+LRU),适用于低并发、非关键业务场景。

Java中用Map实现简单缓存,核心是利用HashMap或ConcurrentHashMap存储键值对,并辅以过期控制、容量限制等策略。它轻量、易理解,适合低并发、非关键业务场景,比如配置项缓存、静态数据临时存储。
基础缓存结构:用ConcurrentHashMap保证线程安全
多线程环境下直接用HashMap会有并发问题,推荐使用ConcurrentHashMap——它天然支持高并发读、安全的写操作,无需额外同步。
- 声明方式:private final Map
cache = new ConcurrentHashMap(); - CacheEntry可封装value、创建时间、有效期(如long expireAt),便于后续判断是否过期
- putIfAbsent()、computeIfAbsent()等方法能减少竞态,提升效率
添加过期机制:时间驱动的简易TTL控制
不依赖第三方库时,可通过记录“过期时间戳”实现TTL(Time-To-Live)。每次get前检查是否过期,过期则移除并返回null。
- 写入时计算过期时间:long expireAt = System.currentTimeMillis() + 5 * 60 * 1000; // 5分钟
- 读取时校验:if (entry.expireAt
- 注意:这种被动清理不会自动回收内存,大量过期数据堆积时建议配合定时清理线程(如ScheduledExecutorService)
限制缓存大小:LRU淘汰策略的轻量实现
当内存敏感或需防止无限增长时,可用LinkedHashMap按访问顺序维护条目,并重写removeEldestEntry()实现LRU。
立即学习“Java免费学习笔记(深入)”;
- 构造时启用访问顺序:new LinkedHashMap(16, 0.75f, true)
- 覆盖方法:protected boolean removeEldestEntry(Map.Entry
eldest) { return size() > MAX_SIZE; } - 注意:LinkedHashMap不是线程安全的,若需并发支持,应加锁或改用ConcurrentLinkedQueue+手动管理,或选用Caffeine等成熟方案
封装成工具类:提供简洁API
把缓存逻辑封装为GenericCache类,对外暴露put(key, value, ttlSeconds)和get(key)方法,隐藏内部细节,提升复用性与可测性。
- 构造时指定最大容量和默认TTL,支持运行时动态调整(谨慎使用)
- get方法内完成过期判断、自动驱逐、返回包装结果(如Optional)
- 可增加clear()、size()、stats()等辅助方法,方便监控与调试










