golang操作redis - Go语言中文社区

golang操作redis


1、配置golang与redis的使用环境

1.1、安装第三方开源的redis库下载地址 here
1.2、将下载好的文件解压并将文件复制到golang安装目录的 srcgithub.comgaryburdredigo(需自己创建目录)下。
在这里插入图片描述

2、下面通过代码介绍golang对redis的简单操作

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

}

redis连接池

在这里插入图片描述
在这里插入图片描述
简单案例:

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 :%sn", res)
	//删除
	conn.Do("del", "user")
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44373940/article/details/104570224
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢