[go-每日一库] golang redigo的redis连接池的实现

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
}

posted on 2022-06-08 18:07  进击的davis  阅读(561)  评论(0编辑  收藏  举报

导航