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)
}
注意事项
- 使用完毕后记得关闭连接
- 对于生产环境,建议使用连接池
- 错误处理很重要,不要忽略错误
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)
性能优化建议
- 使用连接池:避免频繁创建和关闭连接
- 批量操作:使用MSET/MGET等批量命令减少网络往返
- 管道技术:将多个命令打包发送
- 合理设置连接池参数:根据应用负载调整MaxIdle和MaxActive
- 使用Scan代替Keys:避免阻塞Redis服务器
Redigo是一个功能强大且高效的Redis客户端库,通过合理使用可以满足大多数Redis操作需求。以上示例涵盖了Redigo的主要功能,您可以根据实际需求进行调整和扩展。