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

@Cacheable与@CachePut的使用问题及解决方案咨询

用户信息缓存同步问题解决方案

问题1:删除@Cacheable还是改用@CachePut?

绝对不能直接删除@Cacheable——移动端属于高频查看场景,去掉缓存会导致每次查询都穿透到数据库,并发量上升后性能会严重下降。正确的方案是保留查询方法上的@Cacheable,同时在修改方法上添加@CachePut,实现缓存与数据库的同步更新:

  • 查询方法(移动端调用):用@Cacheable缓存查询结果,减少数据库压力
  • 修改方法(网页端调用):用@CachePut在更新数据库后,自动将最新的用户数据写入缓存,替换旧的缓存条目

这样移动端下次查询时,就能直接命中更新后的缓存,拿到最新数据。

代码示例

// EmpServiceImpl.java
// 移动端查询用户信息的方法:缓存查询结果
@Cacheable(value = "empCache", key = "#userId")
public Emp getEmpInfo(Long userId) {
    return empMapper.selectById(userId);
}

// 网页端修改用户信息的方法:更新数据库后同步更新缓存
@CachePut(value = "empCache", key = "#updatedEmp.userId")
public Emp updateEmpInfo(Emp updatedEmp) {
    empMapper.updateById(updatedEmp);
    return updatedEmp; // 必须返回最新的实体对象,@CachePut会把这个值写入缓存
}

关键注意点:

  • @Cacheable和@CachePut的value(缓存空间名称)必须一致,key要指向同一个用户的缓存条目(比如用userId作为key)
  • 修改方法的返回值必须是更新后的完整用户对象,否则缓存会写入不完整数据

问题2:是否可以单独使用@CachePut而不搭配@Cacheable?

完全可以。@CachePut的核心作用是将方法返回值写入指定缓存,不管缓存中原本有没有对应条目,都会执行写入操作:

  • 如果缓存中已有该key的条目,会覆盖成新值
  • 如果缓存中没有,就新增一个缓存条目

单独使用的场景比如:某些修改操作后,需要强制将数据写入缓存(即使之前没有被查询过),或者你希望所有数据都通过修改方法写入缓存,查询时直接读缓存(不过这种场景还是建议搭配@Cacheable做查询缓存,更高效)


内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:31:02