Spring Boot 中 Redis 缓存在 Mybatis 的使用问题

我发现个 Spring Boot 的问题, @CachePut 这个注解,在执行后会将 @Cacheable 已缓存的键值对清除,而 @CacheEvict 是正常工作的。

按理来说 @CachePut 应该是会将实际的修改应用到数据库,并且更新 Redis 对应的缓存值。

源码如下,ORM 是 Mybatis,NO-SQL 是 Redis。
 
@Cacheable(key = "'about' + #p0")
@Select("SELECT * FROM about WHERE id = #{id}")
About selectOne(int id);

@CachePut(key = "'about' + #p0")
@Update("UPDATE about SET url = #{url}, name = #{name}, description = #{description} WHERE id = #{id}")
void updateOne(@Param("id") int id, @Param("url") String url, @Param("name") String name, @Param("description") String description);

@CacheEvict(key = "'about' + #p0", beforeInvocation = true)
@Delete("DELETE FROM about WHERE id = #{id}")
void deleteOne(int id);
也试过了在 Service 层中进行缓存处理,结果还是出现这个问题,Redis 版本也是最新的,实在想不通是怎么回事。
已邀请:

泥瓦匠BYSocket - bysocket.com

赞同来自: hidari_cc

@Cacheable(key = "'about' + #p0")
@Select("SELECT * FROM about WHERE id = #{id}")
About selectOne(int id);

@CacheEvict(key = "'about' + #p0", beforeInvocation = true)
@Update("UPDATE about SET url = #{url}, name = #{name}, description = #{description} WHERE id = #{id}")
void updateOne(@Param("id") int id, @Param("url") String url, @Param("name") String name, @Param("description") String description);

@CacheEvict(key = "'about' + #p0", beforeInvocation = true)
@Delete("DELETE FROM about WHERE id = #{id}")
void deleteOne(int id);
建议这么去写,符合 Cache Aside 缓存更新策略
缓存更新的模式有四种:Cache aside, Read through, Write through, Write behind caching。

失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。

具体见 
《Spring Boot 整合 Redis 实现缓存操作策略》http://spring4all.com/?/article/13
Spring 5 缓存章节 http://docs.spring.io/spring/d ... .html

要回复问题请先登录注册