Redis
go-zero 对 Redis 客户端进行封装,内置连接池、自动重试、指标统计和链路追踪。
Redis: Host: 127.0.0.1:6379 Pass: "" Type: node # node=单机 | cluster=集群import "github.com/zeromicro/go-zero/core/stores/redis"
func NewServiceContext(c config.Config) *ServiceContext { return &ServiceContext{ Config: c, Redis: redis.MustNewRedis(c.Redis), }}// 带过期时间设置(秒)err := rdb.Setex("session:abc123", "userId:42", 3600)
// 读取val, err := rdb.Get("session:abc123")
// 不存在则设置(SETNX)—接口幂等等场景ok, err := rdb.SetnxEx("idempotency:order:X9", "1", 86400)if !ok { return nil, ErrDuplicateRequest}
// 原子自增count, err := rdb.Incr("stats:page:views")lock := redis.NewRedisLock(rdb, "order:process:12345")lock.SetExpire(5) // 锁超时 5 秒
acquired, err := lock.Acquire()if !acquired { return nil, ErrLockNotAcquired}defer lock.Release()// 临界区Hash 操作
Section titled “Hash 操作”// 设置字段err = rdb.Hset("user:42", "name", "Alice")
// 读取字段name, err := rdb.Hget("user:42", "name")
// 获取所有字段fields, err := rdb.Hgetall("user:42")有序集合(排行榜、滑动窗口限流)
Section titled “有序集合(排行榜、滑动窗口限流)”// 添加分数err = rdb.Zadd("leaderboard", 1500, "player:alice")
// 获取前 10(降序)members, err := rdb.ZrevrangeWithScores("leaderboard", 0, 9)
// 滑动窗口限流:用时间戳为 score,删除过期当口now := time.Now().UnixMilli()_ = rdb.Zadd("rl:user:42", float64(now), fmt.Sprintf("%d", now))_ = rdb.Zremrangebyscore("rl:user:42", "0", strconv.FormatInt(now-60000, 10))count, _ := rdb.Zcard("rl:user:42")if count > 100 { return nil, ErrRateLimited}Pipeline 批量命令
Section titled “Pipeline 批量命令”_, err = rdb.Pipelined(func(pipe redis.Pipeliner) error { pipe.Set(ctx, "k1", "v1", time.Minute) pipe.Set(ctx, "k2", "v2", time.Minute) pipe.Incr(ctx, "counter") return nil})发布 / 订阅
Section titled “发布 / 订阅”// 发布_ = rdb.Publish("events:order", `{"id":42,"status":"paid"}`)
// 订阅(通常在后台 goroutine 中运行)pubsub, _ := rdb.Subscribe("events:order")for msg := range pubsub.Channel() { fmt.Println(msg.Payload)}TTL 管理
Section titled “TTL 管理”// 查询剩余 TTLttl, err := rdb.Ttl("session:abc123")
// 刷新 TTL_ = rdb.Expire("session:abc123", 3600)
// 移除 TTL(持久化 key)_ = rdb.Persist("session:abc123")if err := rdb.Ping(); err != nil { httpx.Error(w, err, http.StatusServiceUnavailable) return}