zoukankan      html  css  js  c++  java
  • 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)
    }
  • 相关阅读:
    struts2后台返回json到jsp页面
    潜搜索——搜索界的趋势
    pat1022__字符串查找
    PAT1055___排序神题
    Codeforces Round #205 (Div. 2)C 选取数列可以选择的数使总数最大——dp
    Codeforces Round #204 (Div. 2) C. Jeff and Rounding——数学规律
    队列模拟题——pat1026. Table Tennis
    骰子点数概率__dp
    PAT1034. Head of a Gang ——离散化+并查集
    回文字符串的变形——poj1159
  • 原文地址:https://www.cnblogs.com/open-yang/p/11256943.html
Copyright © 2011-2022 走看看