我先说一下我是怎么使用change data capture来实现缓存失效的。
比如我有UserRepo
,为了避免每次调用方法都要去查询数据库,我使用了@AutoCache
实现了“有缓存直接取缓存;没缓存的话,查询数据库,然后缓存结果”。为了实现缓存失效,我使用了@AutoCacheInvalidation
。
public interface UserMapper {
// select * from user
@AutoCache(timeToLiveInSeconds = 60)
// “将 primaryTable 设为"user"”代表“只要 user 表有变化,Redis 中的 key UserMapper.findAll()需要被清除”
@AutoCacheInvalidation(primaryTable = "user", primaryTableColumns = {},
joinTables = {}, joinTableColumns = {})
List<Object> findAll();
// select * from user where id = #{id}
@AutoCache(timeToLiveInSeconds = 60)
// “将 primaryTable 设为"user",primaryTableColumns 设为{"id"}”代表“如果 id 为 1 的 user 有变化,Redis 中的 key UserMapper.findById(1)需要被清除”
@AutoCacheInvalidation(primaryTable = "user", primaryTableColumns = {"id"},
joinTables = {}, joinTableColumns = {})
Object findById(int id);
// select * from user where name = #{name} and age = #{age}
@AutoCache(timeToLiveInSeconds = 60)
// “将 primaryTable 设为"user",primaryTableColumns 设为{"name", "age"}”代表“如果 name 为 jason 、age 为 18 的 user 有变化,Redis 中的 key UserMapper.findByNameAndAge(jason, 18)需要被清除”
@AutoCacheInvalidation(primaryTable = "user", primaryTableColumns = {"name", "age"},
joinTables = {}, joinTableColumns = {})
List<Object> findByNameAndAge(String name, int age);
}
缓存失效服务会收集@AutoCacheInvalidation
。缓存失效服务通过 change data capture 了解数据库的变化,然后清除相应的 Redis keys 。
想问一下大家是怎么使用 change data capture 来实现缓存失效的,或者针对我现在的实现,给点建议,谢谢。
我会在附言中说明我是怎么处理类似select * from user u join city c on u.city_id = c.id where u.id = 1
这样的语句的,以及怎么处理“方法存在非数据库字段的参数”的(比如UserPostMapper.pageUserPosts(int userId, int offset, int limit)
)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.