@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
相关产品推荐
相关产品推荐

