Golang 如何使用Redis服务

在做开发的时候,如果有缓存的需求,可能就要给后台增加一块Redis块,核心包使用到开源的
github.com/garyburd/redigo

该包提供了连接redis服务,以及封装了redis各种命令函数
1.首先,先给电脑安装redis服务:https://godoc.org/github.com/garyburd/redigo/redis#pkg-variables
2.安装完成后,打开cmd,执行redis-server.exe redis.windows.conf
如果遇到,不存在该命令,则需要在环境变量中path,把redis的路径,即redis-server.exe这个东西所在的目录放进path里
Golang 如何使用Redis服务_第1张图片

3.执行完毕后可以看到下图,代表服务启动了
Golang 如何使用Redis服务_第2张图片

4.编写go文件进行访问和操作
main.go

package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
	"time"
	"encoding/json"
)

func main() {

	//1.连接redis
	c, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("1.连接redis失败", err)
		return
	}
	fmt.Println("1.连接成功",c)
	defer c.Close()

	//2.数据读写 : SET命令和GET命令
	// 2.1 创建key=user_name,value="ft"的redis数据对象,写入
	_, err = c.Do("MSET", "user_name", "ft")
	if err != nil {
		fmt.Println("数据设置失败:", err)
	}

	username, err := redis.String(c.Do("GET", "user_name"))

	if err != nil {
		fmt.Println("数据获取失败:", err)
	} else {
		fmt.Println("2.1.获取user_name",username)
	}
	// 2.2写入一段时限为5秒过期的内容: EX命令
	_, err = c.Do("SET", "user_name2", "ft2","EX", "5")
	if err != nil {
		fmt.Println("数据设置失败:", err)
	}

    //未过期
	username2, err := redis.String(c.Do("GET", "user_name2"))
	if err != nil {
		fmt.Println("数据获取失败:", err)
	} else {
		fmt.Printf("2.2直接获取未过期的 user_name2: %v \n", username2)
	}
	//延迟8秒,过期
	time.Sleep(8 * time.Second)
	username2, err = redis.String(c.Do("GET", "user_name2"))
	if err != nil {
		fmt.Println("2.2过期后数据获取失败:", err)
	} else {
		fmt.Printf("2.2延迟后获取不到过期的 user_name2: %v \n", username2)
	}

	//2.3 批量写入和批量写出:MSET,MGET命令
	_, err = c.Do("MSET", "user_name", "ft","class_name","UD01")
	if err != nil {
		fmt.Println("批量数据设置失败:", err)
	}

	results, err := redis.Strings(c.Do("MGET", "user_name","class_name"))

	if err != nil {
		fmt.Println("数据获取失败:", err)
	} else {
		fmt.Println("2.3批量获取成功",results)
	}

	//2.4 判断是否存在某键值对
	If_Exit, err := redis.Bool(c.Do("EXISTS", "class_name"))
	if err != nil {
		fmt.Println("error:", err)
	} else {
		fmt.Printf("2.4 class_name是否存在: %v \n", If_Exit)
	}

	//3 删除键
	affectCount,err:=redis.Int(c.Do("DEL","class_name"))
	if err != nil {
		fmt.Println("error:", err)
	} else {
		fmt.Printf("3.class_name已经删除,受影响行数: %v \n", affectCount)
	}

	//4 存取json对象 :SETNX 等价于SET if not exist
	key := "jsonKey"
	imap := map[string]string{"username": "666", "phonenumber": "888"}
	value, _ := json.Marshal(imap)

	_,err = c.Do("SETNX", key, value)
	if err != nil {
		fmt.Println(err)
	}


	var result map[string]string

	buf, err := redis.Bytes(c.Do("GET", key))
	if err != nil {
		fmt.Println(err)
	}


	errShal := json.Unmarshal(buf, &result)
	if errShal != nil {
		fmt.Println(err)
	}
	fmt.Println("4.获取json对象成功:userName",result["username"])
	fmt.Println("                 phonenumber",result["phonenumber"])

	//5.设置过期时间 : EXPIRE
	_,err= c.Do("EXPIRE", key, 24*60*60)
	if err != nil {
		fmt.Println(err)
	}


	//6.管道 按照队列先进先出的原则进行send,receive操作
	c.Send("SET", "userId", "DF123")
	c.Send("GET", "userId")
	c.Flush()
	c.Receive() // reply from SET
	valueGet, errr := c.Receive() // reply from GET
	fmt.Println(redis.String(valueGet,errr))
}

补充一个连接池,以及使用连接池获取连接的方法:

func GetRedis(url string) *redis.Pool {
	fmt.Println("get redis url",url)
	return &redis.Pool{
		MaxIdle: 200,
		//MaxActive:   0,
		IdleTimeout: 180 * time.Second,
		Dial: func() (redis.Conn, error) {
			c, err := redis.DialURL(url)
			if err != nil {
				fmt.Println(err)
				return nil, err
			}
			return c, err
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}
}

//如何使用这个redisPool
func TestPool(t *testing.T){
    Pool =GetRedis("redis://localhost:6379")
    con := pool.Get()
	defer con.Close()
	fmt.Println("1.连接成功")

	_, err = con.Do("SET","key", "value")
	...
}

//  下面这个方法,针对的是有密码的redis
// server = "localhost:6379"
// password= ""
// db=0
func newPool(server, password string, db int) *redis.Pool {
	if password == "" {
		panic("pw empty")
	}
	return &redis.Pool{
		MaxIdle:     200,
		IdleTimeout: 240 * time.Second,
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", server)
			if err != nil {
				fmt.Printf("occur error at newPool Dial: %v\n", err)
				return nil, err
			}
			_, e := c.Do("ping")
			if e != nil {
				if password != "" {
					if _, err := c.Do("AUTH", password); err != nil {
						c.Close()
						fmt.Printf("occur error at newPool Do Auth: %v\n", err)
						return nil, err
					}
					if _, e := c.Do("ping"); e != nil {
						return nil, fmt.Errorf("ping twice err: %v", e)
					}
				}
			}

			if _, err := c.Do("SELECT", db); err != nil {
				c.Close()
				fmt.Printf("occur error at newPool Do SELECT: %v\n", err)
				return nil, err
			}
			return c, err
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}
}


结果:

1.连接成功 &{{0 0} 0  0xc042064030 0 0xc0420362a0 0 0xc042040280 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}
2.1.获取user_name ft
2.2直接获取未过期的 user_name2: ft2 
2.2过期后数据获取失败: redigo: nil returned
2.3批量获取成功 [ft UD01]
2.4 class_name是否存在: true 
3.class_name已经删除,受影响行数: 1 
4.获取json对象成功:userName 666
                 phonenumber 888
bar 

你可能感兴趣的:(go)