golang的redis使用

介绍

golang使用redis的介绍,这里我使用的是go mod工具进行打包的

go mod的使用

1.初始化mod

//最后一个参数为名称
go mod init goredis

2.使用init后面的参数,如goredis

//goredis这个时候 = 站点根目录
import "goredis/redis"

3.生成vendor目录

//生成vendor目录
go mod vendor

4.根据本地的vendor来编译

go build -mod=vendor main.go

Redis的使用

1.下载redis依赖包

go get -u github.com/gomodule/redigo/redis
go mod vendor

2.redis使用

err := redis.Set("aa", "399")
if err != nil {
	fmt.Println(err)
}
aa,_ := redis.Get("aa")
redis.Expire("aa", 600) //10分钟后失效
fmt.Println(aa)

Set 写redis
Get 读redis
Expire是设置过期时间

3.启用redis连接池和初始化
请参考pool.go

func init() {//启用连接池
	redisHost := os.Getenv("REDIS_HOST")
	if redisHost == "" {
		redisHost = ":6379"
	}
	Pool = newPool(redisHost)
	cleanupHook()
}
//创建连接池
func newPool(server string) *redis.Pool {

	return &redis.Pool{

		MaxIdle:     3,//最多开启3个链接
		IdleTimeout: 240 * time.Second,//链接超时时间

		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", server)
			if err != nil {
				return nil, err
			}
			return c, err
		},

		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}
}

4.redis方法内部实现
请参考util.go

package redis

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

func Ping() error {

	conn := Pool.Get()
	defer conn.Close()

	_, err := redis.String(conn.Do("PING"))
	if err != nil {
		return fmt.Errorf("cannot 'PING' db: %v", err)
	}
	return nil
}

func Get(key string) (string, error) {

	conn := Pool.Get()
	defer conn.Close()

	var data string
	data, err := redis.String(conn.Do("GET", key))

	return data, err
}

func Set(key string, value string) error {

	conn := Pool.Get()
	defer conn.Close()

	_, err := conn.Do("SET", key, value)
	if err != nil {
		fmt.Println("redis set failed:", err)
	}
	return err
}

//设置过期时间,second如 24*3600
func Expire(key string, second int) error  {
	conn := Pool.Get()
	defer conn.Close()
	n, err := conn.Do("EXPIRE", key, second)
	if n == int64(1) {
		return nil
	}
	return err
}

//判断是否存在key
func Exists(key string) (bool, error) {

	conn := Pool.Get()
	defer conn.Close()

	ok, err := redis.Bool(conn.Do("EXISTS", key))
	if err != nil {
		return ok, fmt.Errorf("error checking if key %s exists: %v", key, err)
	}
	return ok, err
}

func Delete(key string) error {

	conn := Pool.Get()
	defer conn.Close()

	_, err := conn.Do("DEL", key)
	return err
}

func Incr(counterKey string) (int, error) {

	conn := Pool.Get()
	defer conn.Close()

	return redis.Int(conn.Do("INCR", counterKey))
}
conn.Do("redis命令",参数key, 其它参数...)