欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Golang 如何使用Redis服务

程序员文章站 2024-03-03 19:12:46
...

在做开发的时候,如果有缓存的需求,可能就要给后台增加一块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服务

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

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")
    ...
}

结果:

1.连接成功 &{{0 0} 0 <nil> 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 <nil>