Caffeine 3中CacheWriter废弃后的替代实现方案咨询
Caffeine 3.X 替代 CacheWriter 的实现方案
在 Caffeine 3.X 版本中,CacheWriter 被移除后,官方推荐通过 Map 的 compute 系列方法来实现缓存增删后的后续处理。以下是几种实用的实现方式:
1. 缓存写入后的后续处理
通过 Cache.asMap().compute() 方法,在写入缓存的同时触发自定义逻辑,替代原 CacheWriter.write() 的功能:
@Service public class BizCacheService { private final Cache<String, UserInfo> userCache; // 构造注入Caffeine缓存实例(可通过@Bean配置缓存) public BizCacheService(Cache<String, UserInfo> userCache) { this.userCache = userCache; } public void cacheUserWithPostProcess(String userId, UserInfo userInfo) { // 写入缓存并执行后续处理 userCache.asMap().compute(userId, (key, oldUser) -> { // 执行写入后的业务逻辑,比如日志记录、同步到数据库 handleAfterWrite(key, userInfo, oldUser); return userInfo; }); } private void handleAfterWrite(String userId, UserInfo newUser, UserInfo oldUser) { String action = oldUser == null ? "新增" : "更新"; System.out.printf("用户缓存[%s]%s:旧值=%s,新值=%s%n", userId, action, oldUser, newUser); // 这里可以添加实际业务操作,比如更新缓存统计、同步到ES等 } }
2. 缓存移除后的后续处理
同样利用 compute 方法,返回 null 来移除缓存条目,同时在移除前执行自定义逻辑,替代原 CacheWriter.delete():
public void removeUserCacheWithPostProcess(String userId) { userCache.asMap().compute(userId, (key, oldUser) -> { if (oldUser != null) { // 执行移除后的业务逻辑 handleAfterDelete(key, oldUser); } return null; // 返回null触发缓存移除 }); } private void handleAfterDelete(String userId, UserInfo oldUser) { System.out.printf("用户缓存[%s]已移除:值=%s%n", userId, oldUser); // 实际业务场景:清理关联临时资源、记录缓存删除日志等 }
3. 封装通用处理逻辑
如果多个缓存需要复用相同的后续处理逻辑,可以封装成工具类或函数式接口,避免重复代码:
public class CacheProcessUtils { // 通用写入后处理逻辑 public static <K, V> void commonAfterWrite(K key, V newValue, V oldValue) { // 比如统一打印缓存操作日志 String operation = oldValue == null ? "新增" : "更新"; System.out.printf("[通用缓存处理]条目[%s]%s:旧值=%s,新值=%s%n", key, operation, oldValue, newValue); } // 通用移除后处理逻辑 public static <K, V> void commonAfterDelete(K key, V oldValue) { System.out.printf("[通用缓存处理]条目[%s]已移除:值=%s%n", key, oldValue); } }
在业务类中调用通用逻辑:
public void cacheUserWithCommonProcess(String userId, UserInfo userInfo) { userCache.asMap().compute(userId, (key, oldUser) -> { CacheProcessUtils.commonAfterWrite(key, userInfo, oldUser); // 叠加业务自定义逻辑 // bizSpecificAfterWrite(key, userInfo); return userInfo; }); }
内容的提问来源于stack exchange,提问作者Samantha Catania
相关产品推荐
相关产品推荐

