redigo操作redis

前言

redigo能用于go操作redis,用于实现Redis数据库的基本操作,支持Redis的所有命令

redigo使用

redigo依赖安装

使用以下命令安装redigo依赖,以前使用的是这个命令,但是这个依赖过时了,使用最下面的安装依赖

arduino 复制代码
 go get github.com/garyburd/redigo/redis
 

redigo最新依赖

arduino 复制代码
 go get github.com/gomodule/redigo/redis

redigo使用

说明: redigo使用Do()方法操作redis所有的api

redigo连接redis

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}

	a, err1 := c.Do("ping")
	if err1 != nil {
		fmt.Println("连接失败:", err1)
		return
	}
	fmt.Println(a)

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

输出结果为:

备注:

如果redis有密码的话,使用以下连接

go 复制代码
c, err := redis.Dial("tcp", "localhost:6379", redis.DialPassword("123456"))
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}

redigo操作字符串

redis字符串的命令为: 设置数据为:

sql 复制代码
SET a1 a1

获取数据为

sql 复制代码
GET a1

redigo操作字符串

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}

	_, err1 := c.Do("set", "a1", "a1")
	if err1 != nil {
		fmt.Println("设置数据失败:", err1)
		return
	}
	val, err2 := c.Do("get", "a1")
	if err != nil {
		fmt.Println("获取字符串失败:", err2)
		return
	}
	strVal, _ := redis.String(val, nil)
	fmt.Println("数据为: ", strVal)

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

设置键值过期时间示例

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}

	_, err1 := c.Do("set", "hello1", "test", "EX", "5")
	if err1 != nil {
		fmt.Println("设置过期时间失败:", err1)
		return
	}
	time.Sleep(time.Second * 6)
	valWithEx, _ := redis.String(c.Do("get", "hello1"))
	fmt.Println("获取值为:", valWithEx)

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo判断键值是否存在

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}

	// 是否存在指定key
	exists, _ := c.Do("exists", "hello10")
	flag, _ := redis.Int(exists, nil)
	fmt.Println("hello10是否存在:", flag == 1)
	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo操作List

将一个或多个值插入到列表头部

复制代码
LPUSH list1 aa

在列表中添加一个或多个值到列表尾部

kotlin 复制代码
rpush list val

获取列表指定范围内的元素

复制代码
 LRANGE runoobkey 0 10

redigo操作List

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}
	c.Do("lpush", "list1", "l1")

	c.Do("rpush", "list1", "l3")
	list, _ := c.Do("lrange", "list1", "0", "100")
	l, _ := redis.Values(list, nil)
	for _, val := range l {
		fmt.Println(string(val.([]byte)))
	}

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo操作Set

往set1添加数据

复制代码
SADD set1 redis  aaa

获取set1数据

复制代码
SMEMBERS set1

redigo操作set

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}
	c.Do("sadd", "set1", "a1", "a2")

	list, _ := c.Do("smembers", "set1")
	l, _ := redis.Values(list, nil)
	for _, val := range l {
		fmt.Println(string(val.([]byte)))
	}

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo操作hash

redis操作hash,将哈希表 key 中的字段 field 的值设为value

markdown 复制代码
	HSET key field value

获取在哈希表中指定 key 的所有字段和值

vbnet 复制代码
 HGETALL key
 

redigo操作hash

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}
	_, err = c.Do("HSet", "books", "abc", 10)
	if err != nil {
		fmt.Println(err)
		return
	}

	r, err := redis.Int(c.Do("HGet", "books", "abc"))
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}

	fmt.Println(r)

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo操作zset

向有序集合添加一个或多个成员,或者更新已存在成员的分数

css 复制代码
ZADD key score1 member1 [score2 member2]

通过分数返回有序集合指定区间内的成员

arduino 复制代码
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

redigo操作zset

go 复制代码
package main

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("redis连接失败:", err)
		return
	}
	_, err = c.Do("zadd", "runoobkey", 1, "redis")
	if err != nil {
		fmt.Println(err)
		return
	}

	r, err := c.Do("ZRANGE", "runoobkey", 0, 10, "WITHSCORES")
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}

	l, _ := redis.Values(r, nil)
	for _, val := range l {
		fmt.Println(string(val.([]byte)))
	}

	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)
}

redigo使用连接池

go 复制代码
package main

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

var pool *redis.Pool

func init() {
	pool = &redis.Pool{
		MaxIdle:     8,
		MaxActive:   0,  
		IdleTimeout: 300, 
		Dial: func() (redis.Conn, error) { 
			return redis.Dial("tcp", "localhost:6379")
		},
	}
}

func main() {
	c := pool.Get()
	defer func(c redis.Conn) {
		err := c.Close()
		if err != nil {

		}
	}(c)

	_, err := c.Do("set", "hello5", "aaa")
	if err != nil {
		fmt.Println(err)
		return
	}

	r, err := redis.Strings(c.Do("get", "hello5"))
	if err != nil {
		fmt.Println("获取键值失败:", err)
		return
	}
	fmt.Println(r)
	err1 := pool.Close()
	if err1 != nil {
		return
	}
}

总结

redigo的包操作较为简练,一般为操作redis的命令,至于在开发中的技术选型,看个人习惯以及是否能提高自己开发效率而定,但是redigo自身不支持集群,这点需要注意,要支持集群,需要引入其他包

相关推荐
uzong18 分钟前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
谢文峰1 小时前
Graph Engineering 是新范式,还是 AI 圈的又一个新词?
程序员
程序员海军1 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
不能放弃治疗1 小时前
MCP
后端
江湖十年2 小时前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
你驴我3 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
一缕清烟在人间3 小时前
HarmonyOS开发实战:小分享-TextEditPage文字编辑器——Header+TextArea+工具栏
后端·华为·harmonyos·鸿蒙
人间凡尔赛3 小时前
K8s 十年之变:从 Cloud Native 到 AI Native,2026 年后端架构的范式革命
后端·云原生·架构
程序员cxuan3 小时前
Opus 5 深夜炸场,价格还挺香。。。
人工智能·后端·程序员
北冥you鱼3 小时前
Go 语言新手扫盲:指针 * 和 & 使用场景详解
开发语言·后端·golang