go-redis


一、安装和使用

  1. 安装
    go-redis/v8,其 API 简洁且支持 Redis 6+ 特性。安装命令:
  go get github.com/go-redis/redis/v8
  1. 连接 Redis 服务器
    初始化客户端并测试连接:
   import (
       "context"
       "github.com/go-redis/redis/v8"
   )

   func main() {
       ctx := context.Background()
       rdb := redis.NewClient(&redis.Options{
           Addr:     "localhost:6379", // Redis 地址
           Password: "",               // 密码
           DB:       0,               // 数据库编号
       })

       // 测试连接
       if _, err := rdb.Ping(ctx).Result(); err != nil {
           panic("连接失败: " + err.Error())
       }
       defer rdb.Close() // 程序退出时关闭连接
   }

二、基础数据类型操作

1. 字符串(String)

  • 设置/获取值
  // 设置值(0 表示永不过期)
  err := rdb.Set(ctx, "name", "John Doe", 0).Err()
  // 获取值
  val, err := rdb.Get(ctx, "name").Result()

支持批量操作 MSetMGet

  • 原子操作
  // 自增/自减
  rdb.Incr(ctx, "counter")    // +1
  rdb.IncrBy(ctx, "counter", 5) // +5

2. 哈希(Hash)

  • 设置/获取字段
  // 单个字段
  rdb.HSet(ctx, "user:1", "name", "Alice")
  name := rdb.HGet(ctx, "user:1", "name").Val()

  // 批量操作
  userData := map[string]interface{}{"age": 30, "email": "alice@example.com"}
  rdb.HMSet(ctx, "user:1", userData)
  allFields := rdb.HGetAll(ctx, "user:1").Val()

3. 列表(List)

  • 插入/获取元素
  rdb.LPush(ctx, "tasks", "task1")          // 头部插入
  rdb.RPush(ctx, "tasks", "task2")          // 尾部插入
  tasks := rdb.LRange(ctx, "tasks", 0, -1).Val() // 获取全部

4. 集合(Set)

  • 成员操作
  rdb.SAdd(ctx, "tags", "go", "redis")       // 添加成员
  members := rdb.SMembers(ctx, "tags").Val() // 获取所有成员

5. 有序集合(Sorted Set)

  • 分数与排序
  rdb.ZAdd(ctx, "rank", &redis.Z{Score: 100, Member: "user1"})
  top3 := rdb.ZRangeWithScores(ctx, "rank", 0, 2).Val()

三、高级功能

1. 管道(Pipeline)

批量发送命令以减少网络往返时间:

  pipe := rdb.Pipeline()
  pipe.Set(ctx, "key1", "val1", 0)
  pipe.Get(ctx, "key2")
  results, _ := pipe.Exec(ctx)

2. 事务(Transaction)

使用 TxPipeline 保证原子性:

  tx := rdb.TxPipeline()
  tx.Set(ctx, "balance", 100, 0)
  tx.IncrBy(ctx, "balance", 50)
  _, err := tx.Exec(ctx) // 全部执行或回滚

3. 发布订阅(Pub/Sub)

  pubsub := rdb.Subscribe(ctx, "channel1")
  // 接收消息
  msg, err := pubsub.ReceiveMessage(ctx)
  fmt.Println(msg.Channel, msg.Payload)

4. 集群与哨兵模式

集群连接
go rdb := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{"node1:6379", "node2:6379"}, })
哨兵模式
go rdb := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: "mymaster", SentinelAddrs: []string{"sentinel1:26379"}, })


四、性能优化与最佳实践

  1. 连接池管理
    默认已启用连接池,可通过 Options 调整参数(如 PoolSize)。
  2. 错误处理
    所有操作需检查错误:
   val, err := rdb.Get(ctx, "key").Result()
   if err == redis.Nil {
       fmt.Println("键不存在")
   } else if err != nil {
       panic(err)
   }
  1. 键过期与删除
   rdb.Expire(ctx, "key", 10*time.Second) // 设置过期时间
   rdb.Del(ctx, "key1", "key2")          // 删除键
  1. 替代库对比
    Redigo:官方推荐,API 更底层,适合需要精细控制的场景。
    go-redis:更高封装度,支持新特性(如集群、事务)。
滚动至顶部