10.2 Go redis

10.2 Go redis

redis是NoSQL数据, 不是传统的关系型数据库。linux,windows环境皆可安装。

https://redis.io
http://www.redis.cn

redis(Remote Dictionary Server)远程字典服务器,性能非常高,单机15W QPS,适合缓存,持久化数据。

1.1. Go操作redis

使用第三方开源的 redis 库: github.com/garyburd/redigo/redis

go get github.com/garyburd/redigo/redis

获取、设置redis的key-value

string类型

package main

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

func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("连接redis出错,", err)
        return
    }

    defer conn.Close()
    //连接redis,写入数据 string
    res, err := conn.Do("Set", "name", "alexdsb")
    if err != nil {
        fmt.Println("写入数据出错,", err)
        return
    }
    fmt.Println(res)

    //读取redis数据
    data, err := redis.String(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("读取数据出错,", err)
        return
    }
    fmt.Println("读取出redis数据:", data)
}

Go操作redis hash类型

127.0.0.1:6379> HSET key field value

package main

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

func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("连接redis出错,", err)
        return //如果函数异常,直接退出
    }
    //函数推出前,关闭redis连接
    defer conn.Close()

    //写入hash类型数据
    //写入哈希类型,新闻01,标题
    _, err = conn.Do("HSet", "news01", "title", "golang")
    if err != nil {
        fmt.Println("HSet err:", err)
        return //如果函数异常,直接退出
    }

    //写入哈希类型,新闻01,内容
    _, err = conn.Do("HSet", "news01", "content", "life is short ,i use golang")
    if err != nil {
        fmt.Println("HSet err:", err)
        return //如果函数异常,直接退出
    }

    //读取hash数据类型
    data, err := redis.String(conn.Do("HGet", "news01", "title"))
    if err != nil {
        fmt.Println("HGet err:", err)
        return
    }
    fmt.Println("HGet data is :", data)
    //读取hash数据类型
    d2, err := redis.String(conn.Do("HGet", "news01", "content"))
    if err != nil {
        fmt.Println("HGet err:", err)
        return
    }
    fmt.Println("HGet data is :", d2)
}

go操作redis,hash类型,写入多个field-value

127.0.0.1:6379> HMSET key field value [field value ...]

package main

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

func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("连接redis出错,", err)
        return //如果函数异常,直接退出
    }

    //函数推出前,关闭redis连接
    defer conn.Close()

    //写入多个字段
    _, err = conn.Do("HMSet", "news02", "title", "gogogogogogog", "content", "pypypypypypy")
    if err != nil {
        fmt.Println("HMSet err:", err)
        return
    }

    ////读取多个数据
    data, err := redis.Strings(conn.Do("HMGet", "news02", "title", "content"))
    if err != nil {
        fmt.Println("HMGet err:", err)
        return
    }
    //for i, v := range data {
    //    fmt.Printf("data[%d]=%s
", i, v)
    //}

    fmt.Println(data)
}

设置redis数据过期时间

package main

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

func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("连接redis出错,", err)
        return //如果函数异常,直接退出
    }
    defer conn.Close()
    //给redis的key设置过期时间,必选保证key存在!!
    res, err := conn.Do("expire", "age2", 20)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(res)

    //data, err := redis.String(conn.Do("Get", "age2"))
    //if err != nil {
    //    fmt.Println(err)
    //}
    //fmt.Println(data)
}

golang操作redis的list

package main

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

func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("连接redis出错,", err)
        return //如果函数异常,直接退出
    }

    //go操作list
    //注意坑,这里不能再次写入,数据追加写入队列
    _, err = conn.Do("lpush", "duilie", "alex", "wupeiqi", "wenzhou", "大西瓜")
    if err != nil {
        fmt.Println(err)
        return
    }

    data, err := redis.Strings(conn.Do("lrange", "duilie", "0", "-1"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(data)
}

1.2. redis链接池

1.初始化一定数量的链接放入到链接池

2.go需要操作redis时,直接从链接池取出链接

3.节省临时获取redis链接的时间,提高效率

package main

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

//全局变量类型声明
var pool *redis.Pool

//初始化函数,进行链接池初始化
func init() {
    //redis.pool结构体中提供了参数用法
    pool = &redis.Pool{
        MaxIdle:     8,   //最大空闲链接数
        MaxActive:   0,   //保持链接数,0是没限制
        IdleTimeout: 100, //最大空闲时间
        //初始化连接的代码,匿名函数
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "127.0.0.1:6379")
        },
    }
}

func main() {
    //从pool中取出一个链接
    conn := pool.Get()
    defer conn.Close()

    //设置redis数据
    _, err := conn.Do("set", "name", "大狗子")
    if err != nil {
        fmt.Println(err)
        return
    }
    //取出redis数据
    data, err := redis.String(conn.Do("get", "name"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(data)

    //想要从pool取出redis连接,必须保证链接池没关闭
    //pool.Close() //关闭Pool池后,就无法取出redis链接了
    conn2 := pool.Get()
    _, err = conn2.Do("Set", "name2", "大狗子222")
    if err != nil {
        fmt.Println(err)
        return
    }

    //取出数据
    //取出redis数据
    data2, err := redis.String(conn.Do("get", "name2"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(data2)
}
原文地址:https://www.cnblogs.com/open-yang/p/11256943.html