10.2 Go redis

10.2 Go redis

redis is NoSQL data, not a traditional relational database. linux, windows environment able to install.

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

redis (Remote Dictionary Server) remote dictionary server, very high performance, single 15W QPS, for caching, persistent data.

1.1. Go operation redis

Use of third-party open source libraries redis: github.com/garyburd/redigo/redis

go get github.com/garyburd/redigo/redis

Get, set the key-value redis

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 operation redis, hash type, a plurality of field-value write

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\n", 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 connection pooling

1. Initialize the link to put in a certain number of links pool

2.go when action is required redis, taken directly from the link connection pooling

3. Temporary get redis save link time and improve efficiency

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

Guess you like

Origin www.cnblogs.com/open-yang/p/11256943.html