如何实现Redis中的发布订阅机制以优化go缓存设计?

摘要:go缓存设计 redis 发布订阅一般缓存 有内存缓存, 没有就读redis, redis没有就读tidb;如何防止缓存穿透,这里我们用golang.orgxsyncsingleflight解决,还有缓存更新,比如多个节点如何更新,这

go缓存设计 redis 发布订阅

一般缓存 有内存缓存, 没有就读redis, redis没有就读tidb;如何防止缓存穿透,这里我们用golang.org/x/sync/singleflight解决,还有缓存更新,比如多个节点如何更新,这里借用redis 发布订阅;需要更新redis 就发送一条发布消息, 订阅的所有结点就删除内存缓存

缓存代码如下:

package mainimport ("context""encoding/json""fmt""github.com/patrickmn/go-cache""github.com/redis/go-redis/v9""golang.org/x/sync/singleflight""time"
)var globalCache *cache.Cache
var channelKey = "cache_Channel"
var rdb *redis.Clientfunc init() {globalCache = cache.New(5*time.Minute, 10*time.Minute)rdb = redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "", // no password setDB:       0,  // use default DB
    })ctx := context.Background()if _, err := rdb.Ping(ctx).Result(); err != nil {panic(err)}pubSub := rdb.Subscribe(ctx, channelKey)go func() {ch := pubSub.Channel() // 获取一个 channel,用于接收消息for msg := range ch {  // 循环读取消息if key := m
阅读全文