go 操作redis

windows redis下载地址

https://github.com/microsoftarchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.zip

redis操作原理图

在这里插入图片描述

redis启动

./redis-server.exe redis.conf

golang操作redis

安装第三方开源redis库

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

  2. 安装第三方redis库,在 GOPATH路径下执行安装命令

d:\goproject

go get github.com/garyburd/redigo/redis

Set/Get接口

package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	//2.通过go向redis写入数据 string[key-val]
	_, err = conn.Do("set","name", "tomjerry 猫")
	if err != nil {
		fmt.Println("set err=", err)
		return
	}
	//3. 通过go向redis读取数据string[key-val]
	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("get err", err)
		return
	}
	fmt.Println("操作ok", r)
}

操作hash

  • 对hash数据结构,field-val 是一个一个放入和读取
package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	//2. 通过go向redis写入数据string[key-val]
	_, err = conn.Do("HSet", "user01", "name", "john")
	if err != nil {
		fmt.Println("hset err=", err)
		return
	}
	_, err = conn.Do("HSet", "user01", "age", 18)
	if err != nil {
		fmt.Println("hset err=", err)
		return
	}
	//3. 通过go从redis读取数据
	r1, err := redis.String(conn.Do("HGet","user01", "name"))
	if err != nil {
		fmt.Println("hget err=", err)
		return
	}
	r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
	if err != nil {
		fmt.Println("hget err=", err)
		return
	}
	fmt.Printf("操作ok  r1=%v r2=%v \n", r1, r2)
}
  • 对hash数据结构,field-val 批量放入和读取
package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	//2. 通过go向redis写入数据string[key-val]
	_, err = conn.Do("HMSet", "user02", "name", "john", "age", 19)
	if err != nil {
		fmt.Println("HMSet err=", err)
		return
	}
	//3. 通过go向redis读取数据
	r, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age"))
	if err != nil {
		fmt.Println("hget err=", err)
		return
	}
	for i, v := range r {
		fmt.Printf("r[%d]=%s\n", i, v)
	}
}

批量Set/Get数据

package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	//2. 通过go向redis写入数据string[key-val]
	_, err = conn.Do("MSet", "name", "wuxing", "age", 20)
	if err != nil {
		fmt.Println("MSet err=", err)
		return
	}
	//3. 通过go向redis读取数据
	r, err := redis.Strings(conn.Do("MGet", "name", "age"))
	if err != nil {
		fmt.Println("MGet err=", err)
		return
	}
	for _, v := range r {
		fmt.Println(v)
	}
}

给数据设置有效时间

_, err = conn.Do("expire", "name", 10)
package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	//给name数据设置有效时间为10s
	_, err = conn.Do("expire", "name", 10)
	if err != nil {
		fmt.Println("expire err=", err)
		return
	}
	//通过go从redis读取数据
	r, err := redis.Strings(conn.Do("MGet", "name", "age"))
	if err != nil {
		fmt.Println("MGet err=", err)
		return
	}
	for _, v := range r {
		fmt.Println(v)
	}
}

操作list

package main

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

func main()  {
	//通过go向redis写入数据和读取数据
	//1. 连接到redis
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	defer conn.Close()
	_, err = conn.Do("lpush", "heroList", "1.张三", 30, "2.李四", 20)
	if err != nil {
		fmt.Println("lpush err=", err)
		return
	}
	//通过go从redis读取数据
	r, err := redis.String(conn.Do("rpop", "heroList"))
	if err != nil {
		fmt.Println("rpop err=", err)
		return
	}
	fmt.Println(r)
}

redis连接池

  1. 事先初始化一定数量的连接,放入到连接池
  2. 当go需要操作redis时,直接从redis连接池取出连接即可
  3. 这样可以节省临时获取redis连接的时间,从而提高效率

在这里插入图片描述

package main

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

//定义一个全局的pool
var pool *redis.Pool
//当启动程序时,就初始化连接池
func init()  {
	pool = &redis.Pool{
		Dial: func() (conn redis.Conn, e error) {
			return redis.Dial("tcp", "127.0.0.1:6379")
		},
		MaxIdle:         8,//最大空闲连接数
		MaxActive:       0,//最大连接数,0 表示没有限制
		IdleTimeout:     100,//最大空闲时间
	}
}
func main()  {
	//先从pool取出一个连接
	conn := pool.Get()
	defer conn.Close()
	_, err := conn.Do("Set", "name", "tom猫")
	if err != nil {
		fmt.Println("conn.Do err=", err)
		return
	}
	//取出
	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("conn.Do err=", err)
		return
	}
	fmt.Println("r=", r)
	//要从pool取出连接,一定保证连接池是没有关闭的
	conn2 := pool.Get()
	_, err = conn2.Do("Set", "name2", "tom猫2")
	if err != nil {
		fmt.Println("conn.Do err=", err)
		return
	}
	//取出
	r2, err := redis.String(conn2.Do("Get", "name2"))
	if err != nil {
		fmt.Println("conn.Do err=", err)
		return
	}
	fmt.Println("r2=", r2)
}
发布了101 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wuxingge/article/details/104574453