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