您现在的位置是:网站首页> Go语言

go-redis cluster 使用demo

摘要

package main


import (

    "context"

    "fmt"

    "time"


    "github.com/redis/go-redis/v9"

)


func main() {

    // 创建 Redis 集群客户端配置

    // 这里配置多个 Redis 节点地址,确保高可用

    rdb := redis.NewClusterClient(&redis.ClusterOptions{

        // 配置集群节点地址,格式为 host:port

        Addrs: []string{

            "localhost:7001",

            "localhost:7002",

            "localhost:7003",

            "localhost:7004",

            "localhost:7005",

            "localhost:7006",

        },

        // 设置连接池大小

        PoolSize: 50,

        // 设置命令执行超时时间

        ReadTimeout:  2 * time.Second,

        WriteTimeout: 2 * time.Second,

        // 设置密码(如果有的话)

        // Password: "your-password",

    })


    // 创建上下文对象

    ctx := context.Background()


    // 测试连接是否成功

    _, err := rdb.Ping(ctx).Result()

    if err != nil {

        panic(fmt.Sprintf("连接Redis集群失败: %v", err))

    }

    fmt.Println("成功连接到Redis集群")


    // 示例1:设置键值对

    err = rdb.Set(ctx, "user:1", "张三", 24*time.Hour).Err()

    if err != nil {

        fmt.Printf("设置键值对失败: %v\n", err)

        return

    }


    // 示例2:获取值

    val, err := rdb.Get(ctx, "user:1").Result()

    if err == redis.Nil {

        fmt.Println("键不存在")

    } else if err != nil {

        fmt.Printf("获取值失败: %v\n", err)

    } else {

        fmt.Printf("user:1 的值为: %v\n", val)

    }


    // 示例3:使用哈希表

    // HSET 命令示例

    err = rdb.HSet(ctx, "user:profile:1", map[string]interface{}{

        "name":   "张三",

        "age":    25,

        "email":  "zhangsan@example.com",

        "active": true,

    }).Err()

    if err != nil {

        fmt.Printf("设置哈希表失败: %v\n", err)

        return

    }


    // 示例4:获取哈希表中的字段

    name, err := rdb.HGet(ctx, "user:profile:1", "name").Result()

    if err != nil {

        fmt.Printf("获取哈希表字段失败: %v\n", err)

    } else {

        fmt.Printf("用户名: %v\n", name)

    }


    // 示例5:列表操作

    // 从列表左侧添加元素

    err = rdb.LPush(ctx, "recent:users", "user:1", "user:2").Err()

    if err != nil {

        fmt.Printf("列表操作失败: %v\n", err)

    }


    // 示例6:事务操作

    txf := func(tx *redis.Tx) error {

        // 获取当前值

        n, err := tx.Get(ctx, "counter").Int()

        if err != nil && err != redis.Nil {

            return err

        }


        // 实际的操作

        n++

        

        // 执行命令列表

        _, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {

            pipe.Set(ctx, "counter", n, 0)

            return nil

        })

        return err

    }


    // 执行事务

    if err := rdb.Watch(ctx, txf, "counter"); err != nil {

        fmt.Printf("事务执行失败: %v\n", err)

    }


    // 关闭连接

    defer func() {

        if err := rdb.Close(); err != nil {

            fmt.Printf("关闭Redis连接失败: %v\n", err)

        }

    }()

}

这个示例代码包含了以下主要功能:


1. 创建并配置 Redis 集群客户端

   

   - 配置多个节点地址

   - 设置连接池大小

   - 设置超时时间

   - 可选的密码认证

2. 基本操作示例

   

   - 键值对的设置和获取

   - 哈希表操作

   - 列表操作

   - 事务处理

3. 错误处理

   

   - 连接错误处理

   - 操作错误处理

   - 优雅关闭连接


Top