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
