You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:23:36