golang高性能Redis客户端操作插件库redis的使用

Golang高性能Redis客户端操作插件库redis的使用

介绍

go-redis是Go编程语言的官方Redis客户端库。它提供了一个简单直接的接口用于与Redis服务器交互。

安装

首先初始化Go模块:

go mod init github.com/my/repo

然后安装go-redis/v9:

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

快速开始

import (
    "context"
    "fmt"

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

var ctx = context.Background()

func ExampleClient() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 不设置密码
        DB:       0,  // 使用默认数据库
    })

    err := rdb.Set(ctx, "key", "value", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := rdb.Get(ctx, "key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("key", val)

    val2, err := rdb.Get(ctx, "key2").Result()
    if err == redis.Nil {
        fmt.Println("key2不存在")
    } else if err != nil {
        panic(err)
    } else {
        fmt.Println("key2", val2)
    }
    // 输出: key value
    // key2不存在
}

认证方式

Redis客户端支持多种认证方式,优先级从高到低如下:

1. 流式凭证提供者(最高优先级) - 实验性功能

rdb := redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
    StreamingCredentialsProvider: &MyCredentialsProvider{},
})

2. 基于上下文的凭证提供者

rdb := redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
    CredentialsProviderContext: func(ctx context.Context) (string, string, error) {
        // 返回用户名、密码和错误
        return "user", "pass", nil
    },
})

3. 常规凭证提供者

rdb := redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
    CredentialsProvider: func() (string, string) {
        // 返回用户名和密码
        return "user", "pass"
    },
})

4. 用户名/密码字段(最低优先级)

rdb := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    Username: "user",
    Password: "pass",
})

通过URL连接

func ExampleClient() *redis.Client {
    url := "redis://user:password@localhost:6379/0?protocol=3"
    opts, err := redis.ParseURL(url)
    if err != nil {
        panic(err)
    }

    return redis.NewClient(opts)
}

高级用法示例

设置带过期时间的键

// SET key value EX 10 NX
set, err := rdb.SetNX(ctx, "key", "value", 10*time.Second).Result()

排序操作

// SORT list LIMIT 0 2 ASC
vals, err := rdb.Sort(ctx, "list", &redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result()

有序集合操作

// ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2
vals, err := rdb.ZRangeByScoreWithScores(ctx, "zset", &redis.ZRangeBy{
    Min:    "-inf",
    Max:    "+inf",
    Offset: 0,
    Count:  2,
}).Result()

执行Lua脚本

// EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello"
vals, err := rdb.Eval(ctx, "return {KEYS[1],ARGV[1]}", []string{"key"}, "hello").Result()

自定义命令

// 执行自定义命令
res, err := rdb.Do(ctx, "set", "key", "value").Result()

特性

  • 支持除QUIT和SYNC外的所有Redis命令
  • 自动连接池
  • 发布/订阅
  • 管道和事务
  • Lua脚本
  • Redis哨兵
  • Redis集群
  • Redis环
  • Redis性能监控

支持版本

go-redis支持Redis的三个最新版本,目前包括:

  • Redis 7.2
  • Redis 7.4
  • Redis 8.0

文档


更多关于golang高性能Redis客户端操作插件库redis的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能Redis客户端操作插件库redis的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言高性能Redis客户端库使用指南

在Go语言生态中,有几个高性能的Redis客户端库可供选择。下面我将介绍最常用的几个库及其使用方法。

1. go-redis (推荐)

go-redis是目前最流行的Go语言Redis客户端,具有高性能和完整的Redis功能支持。

安装

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

基本使用示例

package main

import (
	"context"
	"fmt"
	"time"

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

func main() {
	// 创建Redis客户端
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Redis服务器地址
		Password: "",               // 密码
		DB:       0,                // 数据库编号
		PoolSize: 100,              // 连接池大小
	})

	ctx := context.Background()

	// 设置键值对,带过期时间
	err := rdb.Set(ctx, "key", "value", 10*time.Minute).Err()
	if err != nil {
		panic(err)
	}

	// 获取值
	val, err := rdb.Get(ctx, "key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("key:", val)

	// 使用管道(Pipeline)批量操作
	pipe := rdb.Pipeline()
	pipe.Set(ctx, "key1", "value1", 0)
	pipe.Set(ctx, "key2", "value2", 0)
	pipe.Incr(ctx, "counter")
	_, err = pipe.Exec(ctx)
	if err != nil {
		panic(err)
	}

	// 事务操作
	txf := func(tx *redis.Tx) error {
		// 获取当前值
		n, err := tx.Get(ctx, "counter").Int()
		if err != nil && err != redis.Nil {
			return err
		}

		// 实际操作(乐观锁定中的本地操作)
		n++

		// 仅在监视的key没有改变的情况下提交
		_, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {
			pipe.Set(ctx, "counter", n, 0)
			return nil
		})
		return err
	}

	// 使用Watch监听key变化
	err = rdb.Watch(ctx, txf, "counter")
	if err != nil {
		panic(err)
	}
}

高级特性

  1. 连接池管理:go-redis内置连接池,可以配置连接池大小和连接超时等参数

  2. Pipeline:批量发送多个命令,减少网络往返时间

  3. 事务:支持MULTI/EXEC事务和WATCH乐观锁

  4. 发布订阅:支持Redis的Pub/Sub功能

  5. Lua脚本:支持执行Lua脚本

2. redigo

redigo是另一个流行的Redis客户端库,比go-redis更轻量级。

安装

go get github.com/gomodule/redigo/redis

基本使用示例

package main

import (
	"fmt"
	"time"

	"github.com/gomodule/redigo/redis"
)

func main() {
	// 创建连接池
	pool := &redis.Pool{
		MaxIdle:     10,
		MaxActive:   100,
		IdleTimeout: 240 * time.Second,
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", "localhost:6379")
		},
	}

	// 从连接池获取连接
	conn := pool.Get()
	defer conn.Close()

	// 设置键值对
	_, err := conn.Do("SET", "key", "value")
	if err != nil {
		fmt.Println("SET error:", err)
		return
	}

	// 获取值
	value, err := redis.String(conn.Do("GET", "key"))
	if err != nil {
		fmt.Println("GET error:", err)
		return
	}
	fmt.Println("Got value:", value)
}

性能优化建议

  1. 使用连接池:避免频繁创建和关闭连接

  2. 合理设置连接池大小:根据并发量调整MaxActive参数

  3. 使用Pipeline:批量操作减少网络往返

  4. 避免大键值:Redis是单线程的,大键值会阻塞其他请求

  5. 合理使用数据结构:根据场景选择合适的数据结构(如Hash, Set, ZSet等)

  6. 使用Scan替代Keys:生产环境避免使用KEYS命令

集群和哨兵模式

go-redis支持Redis集群和哨兵模式:

// 集群模式
rdb := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
})

// 哨兵模式
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
    MasterName:    "mymaster",
    SentinelAddrs: []string{":26379", ":26380", ":26381"},
})

总结

对于大多数Go项目,推荐使用go-redis库,它功能全面、性能优秀且社区活跃。redigo则更适合需要轻量级客户端的场景。在实际使用中,合理配置连接池和利用Pipeline等特性可以显著提升Redis操作性能。

回到顶部