Golang 如何使用Redis服务 - Go语言中文社区

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里
这里写图片描述

3.执行完毕后可以看到下图,代表服务启动了
这里写图片描述

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>
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/fwhezfwhez/article/details/79281414
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 14:28:16
  • 阅读 ( 1846 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢