用go语言操作redis

go语言使用redis需要去下载官方redis工具包

在go_path路径下执行: go get github.com/garyburd/redigo/redis

如果没安装git 你可以去后面那个链接下载一个zip包,然后解压到本地gopath路径下就可以了

gopath路径如果不知道就去看一下环境变量配置参数,一般都能看得到的

当然 也有关于redis的工具不止这一种,这里就不一一举例了,其实最重要的还是你对redis基础和命令的理解

**redis官方文档地址: http://redisdoc.com/string/index.html **

简单的例子

package main

import (
        "fmt"

        "github.com/garyburd/redigo/redis"
)

func string() {
        //通过go向redis 写入数据和读取数据
        //1. 链接到go
        conn, err := redis.Dial("tcp", "127.0.0.1:6379")
        if err != nil {
                fmt.Println("reis connect err=", err)
                return
        }
        defer conn.Close()
        //2. 通过go向redis写入数据 string[key-val]
        _, err = conn.Do("Set", "name", "tom猫")
        if err != nil {
                fmt.Printf("Set err=%v \n", err)
        }

        //3. 从redis读取数据

        r, err := redis.String(conn.Do("Get", "name"))
        if err != nil {
                fmt.Println("get err=", err)
                return
        }

        //name, ok := r.(string)
        fmt.Println("name:", r)
}

func main() {
        //其实都是操作命令  熟练使用redis的命令基本上就会了
        //fixme redis 文档地址:  http://redisdoc.com/string/index.html
        //string()
        //hash()
        //list()
        subscribe()
}
func subscribe() {
        c, err := redis.Dial("tcp", "127.0.0.1:6379")
        if err != nil {
                fmt.Println(err)
                return
        }
        defer c.Close()

        psc := redis.PubSubConn{c}
        psc.Subscribe("redChatRoom")
        for {
                switch v := psc.Receive().(type) {
                case redis.Message:
                        fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
                case redis.Subscription:
                        fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
                case error:
                        fmt.Println(v)
                        return
                }
        }
}

func list() {
        //1.连接到redis数据库
        conn,err :=redis.Dial("tcp","127.0.0.1:6379")
        if err != nil{
                fmt.Println("redis连接失败,错误信息:",err)
                return
        }
        defer conn.Close()
        fmt.Println("redis连接成功")

        //_, err = conn.Do("LPush", "heroList", "songjiang", 23, "long", 29)
        //if err != nil {
        //      fmt.Println(err)
        //      return
        //}
        //fmt.Println("LPush success")


        //values, _ := redis.Values(conn.Do("lrange", "heroList", "0", "100"))
        str, err := redis.String(conn.Do("RPop", "heroList"))
        if err != nil {
                fmt.Println(err)
                return
        }
        fmt.Println(str)
        //for _, v := range values {
        //      fmt.Println(v)
        //}

        // 或者
        //var v1 string
        //redis.Scan(values, &v1)
        //fmt.Println(v1)
}

func hash() {
        ////通过go向redis 写入数据和读取数据
        ////1. 链接到go
        //conn, err := redis.Dial("tcp", "127.0.0.1:6379")
        //if err != nil {
        //      fmt.Println("reis connect err=", err)
        //      return
        //}
        //fmt.Println("-----------")
        //
        //defer conn.Close()
        //2. 通过go向redis写入数据 string[key-val]
        //_, err = conn.Do("HSet", "user", "name", "john")
        //if err != nil {
        //      fmt.Printf("Set err=%v \n", err)
        //}
        //_, err = conn.Do("HSet", "user", "age", 18)
        //if err != nil {
        //      fmt.Printf("Set err=%v \n", err)
        //}
        //_, err = conn.Do("HSet", "user", "gender", "boy")
        //if err != nil {
        //      fmt.Printf("Set err=%v \n", err)
        //}
        //
        ////3. 从redis读取数据
        //
        //r, err := redis.String(conn.Do("HGet", "user", "name"))
        //if err != nil {
        //      fmt.Println("get err=", err)
        //      return
        //}
        //
        ////name, ok := r.(string)
        //fmt.Println("name:", r)

        /*
        批量操作
         */
        //1.连接到redis数据库
        con,err :=redis.Dial("tcp","127.0.0.1:6379")
        if err != nil{
                fmt.Println("redis连接失败,错误信息:",err)
                return
        }
        defer con.Close()
        fmt.Println("redis连接成功")

        //2.通过go向redis写入数据
        _,err = con.Do("HMSet","user2","name","Bob大米","age","19")
        if err != nil{
                fmt.Println("hmset出错,错误信息:",err)
                return
        }

        fmt.Println("hmset ok")

        //3.通过go向redis读取数据
        reply,err := redis.Strings(con.Do("HMGet","user2","name","age"))
        if err != nil{
                fmt.Println("hmget出错,错误信息:",err)
                return
        }
        fmt.Println("hmget ok")

        for i,v := range reply{
                fmt.Printf("[%d]=%s\t",i,v)
        }

}

redis连接池的创建

package main

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

var pool *redis.Pool
func init()  {
        pool = &redis.Pool{
                MaxIdle:8,// 最大空闲链接
                MaxActive:0,// 表示和数据库的最大连接数
                IdleTimeout:100,// 最大空闲时间
                Dial: func() (redis.Conn, error) {
                        return redis.Dial("tcp", "localhost:6379")
                },
        }
}

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

        //
        _, err := conn.Do("Set", "name", "hiram~")
        if err != nil {
                fmt.Println(err)
                return
        }

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

}