使用 golang 操作 redis

使用 golang 操作 redis

首先使用 go get 安装第三方开源库。

go get github.com/garyburd/redigo/redis

连接 redis

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)
func main() {
    c, err := redis.Dial("tcp", "localhost:6379")
    if err != nil {
        fmt.Println("conn redis failed,", err)
        return
    } 
    fmt.Println("redis conn success")
    defer c.Close()
}

通过这个语句可以判断是否连接到了 redis

代码示例

接下来直接通过代码来举例各种功能

package main

import (
	"fmt"
	"time"

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

func main() {
	c, err := redis.Dial("tcp", "localhost:6379") //连接库
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}
	defer c.Close()
	/* string类型的 set 和 get操作  */
	fmt.Println("string 类型的 set 和 get操作:")
	_, err = c.Do("Set", "abc", 100) //进行 set abc 100 的操作
	if err != nil {
		fmt.Println(err)
		return
	}
	r1, err := redis.Int(c.Do("Get", "abc")) //读取数据 get abc ,然后转换成int型
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}
	fmt.Println(r1) //输出 100 ,为刚刚设置的 abc

	/* string 类型的批量操作 */
	fmt.Println("string 类型的批量操作:")
	_, err = c.Do("mset", "abc", 100, "efg", 300) // 执行 mset abc 100 efg 300
	if err != nil {
		fmt.Println(err)
		return
	}
	r2, err := redis.Ints(c.Do("mget", "abc", "efg")) //执行 mget abc efg,并转换成 int 型的切片
	if err != nil {
		fmt.Println("get abc failed", err)
		return
	}
	for _, v := range r2 {
		fmt.Println(v)
	}
	/* 设置过期时间,过期时间过了之后,该元素会自动删除 */
	fmt.Println("设置过期时间,过期时间过了之后,该元素会自动删除:")
	_, err = c.Do("set", "abc", "100")
	_, err = c.Do("expire", "abc", 3) // 执行 expire abc 3 ,代表3秒后 abc 这个元素就不存在了
	if err != nil {
		fmt.Println(err)
		return
	}
	r3, err := redis.String(c.Do("get", "abc")) //执行 get abc
	fmt.Println("abc is : ", r3)
	time.Sleep(5 * time.Second) //停止5秒
	r3, err = redis.String(c.Do("get", "abc"))
	if err != nil {
		fmt.Println(err) //如果输出,就证明元素已经删除了
	} else {
		fmt.Println("after 10s , abc is : ", r3)
	}

	/* list 队列操作 */
	fmt.Println("list 队列操作")
	_, err = c.Do("lpush", "book_list", "abc", "ceg", 300) //执行 lpush book_list abc ceg 300
	if err != nil {
		fmt.Println(err)
		return
	}
	r4, err := redis.String(c.Do("lpop", "book_list")) //执行 lpop book_list ,移出并获取列表的第一个元素
	if err != nil {
		fmt.Println("get abc failed", err)
		return
	}
	fmt.Println("删除的元素为:", r4)
	r5, err := redis.Strings(c.Do("lrange", "book_list", "0", "10")) // 执行 lrange book_list 0 10
	fmt.Print("剩余元素为:")
	for _, v := range r5 {
		fmt.Print(v, " ")
	}
	fmt.Println()

	/* hash表操作 */
	fmt.Println("hash表操作")
	_, err = c.Do("hset", "books", "abc", 100) //执行 hset books abc 100
	if err != nil {
		fmt.Println(err)
		return
	}
	r6, err := redis.Int(c.Do("hget", "books", "abc")) // 执行 hget books abc
	if err != nil {
		fmt.Println("get abc failed", err)
		return
	}
	fmt.Println(r6)
}

redis 连接池

直接通过代码来看

package main

import (
	"fmt"

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

var pool *redis.Pool //创建redis连接池

func init() {
	pool = &redis.Pool{ //实例化一个连接池
		MaxIdle: 16, //最初的连接数量
		// MaxActive:1000000,    //最大连接数量
		MaxActive:   0,   //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配
		IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
		Dial: func() (redis.Conn, error) { //要连接的redis数据库
			return redis.Dial("tcp", "localhost:6379")
		},
	}
}

func main() {
	c := pool.Get() //从连接池,取一个链接
	defer c.Close() //函数运行结束 ,把连接放回连接池

	_, err := c.Do("Set", "abc", 200)
	if err != nil {
		fmt.Println(err)
		return
	}

	r, err := redis.Int(c.Do("Get", "abc"))
	if err != nil {
		fmt.Println("get abc faild :", err)
		return
	}
	fmt.Println(r)
	pool.Close() //关闭连接池
}

你可能感兴趣的:(【GoLang】)