1.1、安装第三方开源的redis库下载地址 here
1.2、将下载好的文件解压并将文件复制到golang安装目录的 src\github.com\garyburd\redigo(需自己创建目录)下。
package test
import (
"fmt"
"github.com/garyburd/redigo/redis"
"os"
"testing"
)
/**
* @Description: 使用单元测试 将对redis的不同操作分开,便于观察
* @Author: guai
* @Date:2020/2/29 11:40
**/
//定义一个全局的连接
var (
conn, err = redis.Dial("tcp", "127.0.0.1:6379")
)
// 相当于测试时要执行的前置函数(生成的测试将调用 TestMain(m),而不是直接运行测试。
// TestMain 运行在主 goroutine 中, 可以在调用 m.Run 前后做任何设置和拆卸。)
func TestMain(m *testing.M) {
fmt.Println("TestMain!")
if err != nil {
fmt.Println("conn err:", err)
return
}
//退出该方法,继续向下执行 (或者叫拆卸)
os.Exit(m.Run())
}
//测试通过get和set操作redis的string【key-value】类型的数据
func TestStrSetGet(t *testing.T) {
//1、通过golang向redis添加和获取key-value
//1.1、通过第三方库于redis建立连接
//conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("connect redis err:", err)
return
}
//1.2、通过延时机制以及时关闭连接
defer conn.Close()
//1.3、通过go向redis 写入string[key-value]
_, err = conn.Do("set", "name", "hello 乖")
if err != nil {
fmt.Println("set err:", err)
return
}
//1.4 、通过go从redis读取 指定key及value
res, err := conn.Do("get", "name")
if err != nil {
fmt.Println("get err:", err)
return
}
//打印通过get取得的值
t.Logf("get key-value: %s", res)
}
//测试 作redis的string【key-value】类型数据的其它常用方法
func TestStrMeth(t *testing.T) {
//修改 上面插入的name的值
//先查询原本的值
res, err := conn.Do("get", "name")
if err != nil {
fmt.Println("get err:", err)
}
t.Logf("update before name:%s", res)
//修改
res, _ = conn.Do("set", "name", "hello 乖")
//查询修改后的值
res, _ = conn.Do("get", "name")
t.Logf("update after name:%s", res)
//查询 某一个值是否存在
res, _ = conn.Do("exists", "name", "hello 乖")
t.Log("exists:", res)
//删除一个key-value
res, _ = conn.Do("del", "name")
t.Logf("del :%d", res)
//批量添加与批量查询
res, _ = conn.Do("mset", "name", "guai", "age", 18)
t.Logf("mset:%s", res)
//批量查询
res, _ = conn.Do("mget", "name", "age")
t.Logf("mget :%s", res)
//清空当前数据库
conn.Do("flushdb")
}
//对Hash类型操作
func TestHashSG(t *testing.T) {
//添加一个hash
res, _ := conn.Do("hset", "user", "name", "guai")
t.Logf("hset:%d", res)
//(注意:当多次 set 同一个 field和value时相当于修改
res, _ = conn.Do("hget", "user", "name")
t.Logf("hget:%s", res)
//批量添加
_, _ = conn.Do("hmset", "user", "age", 18, "sex", "男")
//批量查询
res, _ = conn.Do("hmget", "user", "name", "age", "sex")
t.Logf("hmget:%s", res)
//判断某一个field-value是否存在
res, _ = conn.Do("hexists", "user", "name", "guai")
t.Logf("hexists:%d", res)
//获取指定hash中的field-value数量
res, _ = conn.Do("hlen", "user")
t.Logf("hlen:%d", res)
//清空当前数据库
conn.Do("flushdb")
}
//List的操作
func TestListPR(t *testing.T) {
//添加list
conn.Do("lpush", "name", "guai", "cabbage", "乖", "wenwen", "rabits")
//查询list 0 和 -1 带不带引号都可
res, _ := conn.Do("lrange", "name", 0, -1)
t.Logf("lrange:%s", res)
//修改指定key的指定index上的value
conn.Do("lset", "name", "0", "setguai")
res, _ = conn.Do("lrange", "name", "0", "-1")
t.Logf("修改list指定位置上的值: %s", res)
//获取list的长度
res, _ = conn.Do("llen", "name")
t.Logf("list len:%d", res)
// 删除指定key上的指定count个数的与value相同的值
//删除key为name的list上的 1 个值为setguai的value
conn.Do("lrem", "name", "1", "setguai")
res, _ = conn.Do("lrange", "name", "0", "-1")
t.Logf("lrem: %s", res)
//从列表的右端插入值
conn.Do("rpush", "name", "shuai")
res, _ = conn.Do("lrange", "name", "0", "-1")
t.Logf(" rpush :%s", res)
//从列表的两端弹出值(弹出的值将从列表中删除)
rRes, _ := conn.Do("rpop", "name")
lRes, _ := conn.Do("lpop", "name")
t.Logf("rRes=%s lRes=%s", rRes, lRes)
//给name设置有效时间为 10s
conn.Do("expire", "name", 10)
//删除
//conn.Do("del","name")
}
// 无序set集合的操作
func TestSet(t *testing.T) {
//创建一个集合并添加数据
conn.Do("sadd", "name", "guai", "shuai", "乖")
//查询结果
res, _ := conn.Do("smembers", "name")
t.Logf("set:%s", res)
//查询指定key的member个数
res, _ = conn.Do("scard", "name")
t.Logf("scard:%d", res)
//判断一个值是否存在
res, _ = conn.Do("sismember", "name", "shuai")
t.Logf("sismember:%d", res)
//删除指定位置的值
conn.Do("srem", "name", "guai")
res, _ = conn.Do("smembers", "name")
t.Logf("srem: %s", res)
//删除集合
conn.Do("del", "name")
}
//有序集合的操作
func TestZSet(t *testing.T) {
//创建一个有序集合并添加值
// 下面语句的含义 闯将一个 名字为user的有序集合 并添加一个值 guai 它的sorce为5 排序依据
//将来会根据 score 的大小为集合中的值排序 ,score的值可以是整数也可以是浮点数
conn.Do("zadd", "user", "5", "guai")
//根据score排序可知 结果为shuai 乖 guai wenwen 数字从小到大
conn.Do("zadd", "user", "2", "shuai", "6", "wenwen", "2.5", "乖")
//查询
res, _ := conn.Do("zrange", "user", "0", "-1")
t.Logf("zrange :%s", res)
//返回集合中的数据总数
res, _ = conn.Do("zcard", "user")
t.Logf("zcard:%d", res)
//删除指定值
res, _ = conn.Do("zrem", "user", "乖", "guai")
res, _ = conn.Do("zrange", "user", "0", "-1")
t.Logf("zrem :%s", res)
//删除
conn.Do("del", "user")
}
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
/**
* @Description: redis连接池
* @Author: guai
* @Date:2020/2/29 16:18
**/
//定义一个全局的pool
var pool *redis.Pool
//程序启动时 初始化连接池
func init() {
pool = &redis.Pool{
MaxIdle: 8, //最大空闲连接数
MaxActive: 0, //表示和数据库的最大连接数,0表示没有限制
IdleTimeout: 100, //最大空闲时间
//创建链接
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
//先从pool中取出一个连接
conn := pool.Get()
//延迟机制 在函数结束时关闭连接
defer conn.Close()
//添加一个名字为user的字符串
_, err := conn.Do("set", "user", "guai")
if err != nil {
fmt.Println("set err:", err)
return
}
//查询
res, _ := conn.Do("get", "user")
fmt.Printf("get :%s\n", res)
//删除
conn.Do("del", "user")
}