你们是怎么使用 change data capture 来实现缓存失效的?

2020-10-23 22:11:52 +08:00
 JasonLaw

我先说一下我是怎么使用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))。

800 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX