go redigo 学习笔记

2,820 阅读1分钟
1. 获取 redigo
go get github.com/gomodule/redigo/redis
2. 连接 redis

使用 redis.Dial("tcp", "127.0.0.1:6379") 进行连接。

3. 操作

redis.Conn.Do():用于执行各种 redis 命令。

redis.String():接受Do方法返回的值,并将其转为字符串。

redis.Strings():接受Do方法返回的值,并将其转为字符串切片。

redis.Int64():接受Do方法返回的值,并将其转为整数。

redis.Int64s():接受Do方法返回的值,并将其转为整数切片。

redis.Float64():接受Do方法返回的值,并将其转为浮点数。

redis.Float64s():接受Do方法返回的值,并将其转为浮点数切片。

redis.Values():接受Do方法返回的值,一般用来接收 hash 类型的值。

4. 管道的使用

redis.Conn.Send():将 redis 命令存放在缓存区,可以有多个 Send 方法,这个时候命令并没有发送给 redis 。

redis.Conn.Flush():刷新缓存区,并将命令一起发送给 redis 执行。

redis.Conn.Receive():接受返回。

5. 代码 demo
package main

import (
	"fmt"

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

func main() {
	//获取连接
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Printf("redis conn err %v", err)
		return
	}
	//关闭连接
	defer conn.Close()
	//使用 redis.Conn.Do() 方法执行命令
	conn.Do("set", "k1", "redis")
	//redis.String()
	v1, err := redis.String(conn.Do("get", "k1"))
	if err != nil {
		fmt.Printf("err is %v\n", err)
	} else {
		fmt.Printf("v1 is %s\n", v1)
	}
	//添加 list
	conn.Do("lpush", "l1", 1)
	conn.Do("lpush", "l1", 2)
	conn.Do("lpush", "l1", 3)
	conn.Do("lpush", "l1", 4)
	//获取 list 长度
	len, _ := redis.Int64(conn.Do("llen", "l1"))
	fmt.Printf("l1 len is %d\n", len)
	//取第一个值
	l1, _ := redis.Int64(conn.Do("lpop", "l1"))
	fmt.Printf("l1 pop %d\n", l1)
	//遍历
	values, _ := redis.Int64s(conn.Do("lrange", "l1", 0, -1))
	for i, v := range values {
		fmt.Printf("l1[%d] is %d\n", i, v)
	}

	//hash
	conn.Do("hset", "h1", "id", 1)
	conn.Do("hset", "h1", "name", "tom")
	conn.Do("hset", "h1", "age", 18)
	conn.Do("hmset", "h2", "id", 2, "name", "jinx", "age", 17)

	hv, err := redis.Values(conn.Do("hmget", "h1", "id", "name", "age"))
	if err != nil {
		fmt.Printf("err is %v\n", err)
	}
	for _, v := range hv {
		fmt.Printf("%s\n", v.([]byte))
	}
	//
	h2v, err := redis.Values(conn.Do("hgetall", "h2"))
	if err != nil {
		fmt.Printf("err is %v\n", err)
	}
	for _, v := range h2v {
		fmt.Printf("%s\t", v.([]byte))
	}
	fmt.Println()
	//管道的使用
	conn.Send("setnx", "lock", "lock")
	conn.Send("setex", "lock", 10, "lock")
	conn.Flush()
	r, err := conn.Receive()
	if err != nil {
		fmt.Printf("err is %v\n", err)
	} else {
		fmt.Printf("%v\n", r)
	}
}