一文搞懂redis异步缓存失效机制
redis缓存数据库数据,当数据库数据被更新时,需要通知redis对应缓存失效。最简单的通知方式就是在数据库完成更新后,更新redis的数据,但是这样会面临一个问题,这个操作不是原子的,因此客户会请求到失效的缓存。如果更新完数据库后更新缓存之前,线程被调度,这样就会产生时间gap。如何解决这个问题呢?大部分人可能想到加锁,锁住一个热点数据缓存可不是一个明智之举。
发布订阅设计模型是非常著名的异步模型,其响应非常快,数据库的更新和缓存的更新位于两个线程,可以有效降低上述问题发生的原因。
那么如何设计实现异步缓存失效模型呢?
通知函数,作用是在想要通知redis缓存失效的地方调用以通知
1
2
3
4
func UpdatePost(key string) {
// post_cache 是订阅根据
rdb.Publish(ctx, "post_cache", key)
}
订阅函数,用于redis客户端调用开放订阅,单机模式下调用一次,集群模式下调用多次。
1
2
3
4
5
6
7
8
9
10
11
func SubChannel() {
sub := rdb.Subscribe(ctx, "post_cache")
ch := sub.Channel()
go func() {
for msg := range ch {
if err := DeleteKey(msg.Payload); err != nil {
log.Println("delete key ERROR:", err)
}
}
}()
}
This post is licensed under CC BY 4.0 by the author.