golang高效Redis数据库客户端插件库redigo的使用

Golang高效Redis数据库客户端插件库Redigo的使用

Redigo是一个Go语言的Redis/Valkey数据库客户端库。

特性

  • 支持所有Redis命令的类Print API
  • 管道操作,包括管道事务
  • 发布/订阅功能
  • 连接池
  • 脚本辅助类型,支持EVALSHA的乐观使用
  • 处理命令回复的辅助函数

安装

使用go get命令安装Redigo:

go get github.com/gomodule/redigo/redis

完整示例Demo

以下是一个使用Redigo连接Redis并进行基本操作的完整示例:

package main

import (
	"fmt"
	"github.com/gomodule/redigo/redis"
	"log"
)

func main() {
	// 创建Redis连接
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	// 设置键值对
	_, err = conn.Do("SET", "mykey", "Hello Redigo")
	if err != nil {
		log.Fatal(err)
	}

	// 获取键值
	value, err := redis.String(conn.Do("GET", "mykey"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("GET mykey:", value)

	// 使用管道批量操作
	conn.Send("MULTI")
	conn.Send("INCR", "counter")
	conn.Send("INCR", "counter")
	conn.Send("INCR", "counter")
	reply, err := conn.Do("EXEC")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("EXEC reply:", reply)

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

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

	// 使用连接池连接执行命令
	_, err = poolConn.Do("SET", "poolkey", "Pool Value")
	if err != nil {
		log.Fatal(err)
	}

	poolValue, err := redis.String(poolConn.Do("GET", "poolkey"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("GET poolkey:", poolValue)
}

高级用法示例

发布/订阅示例

func subscribeExample() {
	// 创建订阅连接
	subConn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		log.Fatal(err)
	}
	defer subConn.Close()

	// 创建发布连接
	pubConn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		log.Fatal(err)
	}
	defer pubConn.Close()

	// 订阅频道
	psc := redis.PubSubConn{Conn: subConn}
	psc.Subscribe("mychannel")

	// 在goroutine中监听消息
	go func() {
		for {
			switch v := psc.Receive().(type) {
			case redis.Message:
				fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
			case redis.Subscription:
				fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
			case error:
				fmt.Println("Error:", v)
				return
			}
		}
	}()

	// 发布消息
	_, err = pubConn.Do("PUBLISH", "mychannel", "hello")
	if err != nil {
		log.Fatal(err)
	}

	time.Sleep(time.Second)
}

使用Lua脚本示例

func scriptExample(conn redis.Conn) {
	// 创建脚本
	script := redis.NewScript(1, `
		local value = redis.call("GET", KEYS[1])
		return value
	`)

	// 执行脚本
	value, err := redis.String(script.Do(conn, "mykey"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Script result:", value)
}

注意事项

  1. 使用完毕后记得关闭连接
  2. 对于生产环境,建议使用连接池
  3. 错误处理很重要,不要忽略错误

Redigo是一个功能强大且高效的Redis客户端库,适合在Go项目中使用Redis的各种功能。


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

1 回复

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


Redigo - Golang高效Redis客户端库使用指南

Redigo是Go语言中一个轻量级、高效的Redis客户端库,它提供了简洁的API和良好的性能。下面我将详细介绍Redigo的使用方法。

安装Redigo

go get github.com/gomodule/redigo/redis

基本使用

连接Redis

package main

import (
	"github.com/gomodule/redigo/redis"
	"log"
	"time"
)

func main() {
	// 创建连接池
	pool := &redis.Pool{
		MaxIdle:     10,               // 最大空闲连接数
		MaxActive:   100,              // 最大活跃连接数
		IdleTimeout: 240 * time.Second, // 空闲连接超时时间
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", "localhost:6379")
		},
	}
	defer pool.Close()

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

	// 测试连接
	_, err := conn.Do("PING")
	if err != nil {
		log.Fatal("无法连接Redis:", err)
	}
	log.Println("成功连接Redis")
}

基本命令操作

// 设置键值
_, err := conn.Do("SET", "name", "张三")
if err != nil {
	log.Fatal(err)
}

// 获取键值
name, err := redis.String(conn.Do("GET", "name"))
if err != nil {
	log.Fatal(err)
}
log.Println("name:", name)

// 设置带过期时间的键
_, err = conn.Do("SETEX", "temp_key", 60, "临时值")
if err != nil {
	log.Fatal(err)
}

// 检查键是否存在
exists, err := redis.Bool(conn.Do("EXISTS", "name"))
if err != nil {
	log.Fatal(err)
}
log.Println("name exists:", exists)

// 删除键
_, err = conn.Do("DEL", "name")
if err != nil {
	log.Fatal(err)
}

哈希操作

// 设置哈希字段
_, err := conn.Do("HSET", "user:1001", "name", "李四", "age", 30)
if err != nil {
	log.Fatal(err)
}

// 获取单个哈希字段
age, err := redis.Int(conn.Do("HGET", "user:1001", "age"))
if err != nil {
	log.Fatal(err)
}
log.Println("age:", age)

// 获取所有哈希字段
userInfo, err := redis.StringMap(conn.Do("HGETALL", "user:1001"))
if err != nil {
	log.Fatal(err)
}
log.Println("user info:", userInfo)

列表操作

// 向列表添加元素
_, err := conn.Do("LPUSH", "tasks", "task1", "task2", "task3")
if err != nil {
	log.Fatal(err)
}

// 获取列表长度
length, err := redis.Int(conn.Do("LLEN", "tasks"))
if err != nil {
	log.Fatal(err)
}
log.Println("tasks length:", length)

// 获取列表元素
tasks, err := redis.Strings(conn.Do("LRANGE", "tasks", 0, -1))
if err != nil {
	log.Fatal(err)
}
log.Println("tasks:", tasks)

发布订阅模式

// 订阅者
func subscriber() {
	conn := pool.Get()
	defer conn.Close()

	psc := redis.PubSubConn{Conn: conn}
	psc.Subscribe("channel1")
	
	for {
		switch v := psc.Receive().(type) {
		case redis.Message:
			log.Printf("收到消息: %s %s\n", v.Channel, v.Data)
		case redis.Subscription:
			log.Printf("订阅成功: %s %d\n", v.Channel, v.Count)
		case error:
			log.Println("订阅错误:", v)
			return
		}
	}
}

// 发布者
func publisher() {
	conn := pool.Get()
	defer conn.Close()

	for i := 0; i < 5; i++ {
		_, err := conn.Do("PUBLISH", "channel1", fmt.Sprintf("消息%d", i))
		if err != nil {
			log.Fatal(err)
		}
		time.Sleep(time.Second)
	}
}

// 在主函数中启动订阅者和发布者
go subscriber()
time.Sleep(time.Second) // 确保订阅者先启动
go publisher()

事务处理

// 开启事务
conn.Send("MULTI")
conn.Send("INCR", "counter")
conn.Send("INCR", "counter")
conn.Send("INCR", "counter")

// 执行事务
reply, err := conn.Do("EXEC")
if err != nil {
	log.Fatal(err)
}

// 处理事务结果
counters, err := redis.Values(reply, err)
if err != nil {
	log.Fatal(err)
}

for i, counter := range counters {
	log.Printf("操作%d结果: %d\n", i, counter)
}

管道操作

// 启用管道
conn.Send("SET", "pipe1", "value1")
conn.Send("SET", "pipe2", "value2")
conn.Send("GET", "pipe1")
conn.Send("GET", "pipe2")

// 刷新管道并获取所有响应
conn.Flush()

// 读取响应
reply1, err := conn.Receive()
reply2, err := conn.Receive()
val1, err := redis.String(conn.Receive())
val2, err := redis.String(conn.Receive())

log.Println("管道操作结果:", reply1, reply2, val1, val2)

性能优化建议

  1. 使用连接池:避免频繁创建和关闭连接
  2. 批量操作:使用MSET/MGET等批量命令减少网络往返
  3. 管道技术:将多个命令打包发送
  4. 合理设置连接池参数:根据应用负载调整MaxIdle和MaxActive
  5. 使用Scan代替Keys:避免阻塞Redis服务器

Redigo是一个功能强大且高效的Redis客户端库,通过合理使用可以满足大多数Redis操作需求。以上示例涵盖了Redigo的主要功能,您可以根据实际需求进行调整和扩展。

回到顶部