1.介绍

go-redis 三方库为我们封装了很多函数来执行 Redis 命令,而 redigo 三方库只有一个 Do 函数执行 Redis 命令,更接近使用 redis-cli 操作 Redis,这一点是我个人比较喜欢的,只要熟悉 Redis,就可以轻松使用 redigo 作为客户端操作 Redis,而不需要再去记三方库封装的函数。

2.连接池的简单实现

代码结构
.
+--- go.mod
+--- go.sum
+--- main.go
+--- pool
|   +--- redis-pool.go
redis-pool
package pool

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

var (
	pool *redis.Pool
)

func init()  {
	pool = &redis.Pool{
		MaxIdle: 10,
		MaxActive: 5,
		IdleTimeout: 100,
		Dial: dialFunc,
	}
	client := pool.Get()
	res, err := redis.String(client.Do("ping"))
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("init result:", res)
}

func dialFunc() (redis.Conn, error) {
	conn, err := redis.Dial("tcp", "localhost:6370")
	if err != nil {
		log.Fatal(err.Error())
	}
	return conn, nil
}

func GetRDB() redis.Conn {
	return pool.Get()
}

main
package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
	"go-reids-pool/pool"
)

func main()  {
	rdb := pool.GetRDB()
	if rdb == nil {
		fmt.Errorf("rdb is nil")
	}
	name := "zhangsan"
	key := "name:zhangsan"

	_, err := rdb.Do("set", key, name) // 操作如同redis-cli
	if err != nil {
		fmt.Println(err)
	}

	result , err := redis.String(rdb.Do("get", key)) // 获取结果
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println("cache key: name:zhangsan, value:", result) // zhangsan
}