GO语言中Redis的相关知识记录
最近看到这个
github/go-redis/redis/v8已经更新了,今天下载下来用用
这里分享一个关于redis实战的书籍,分享链接,可以查底下留言获取
安装Redis包
go get github/go-redis/redis/v8
由于这个`v8`版本,使用了`context`这个包,`context`这个包是做什么的呢?
这个包提供上下文机制在`goroutine`之间传递`deadline`,`取消信号 `
或其请求相关的信息,其实说白了就是,如何优雅的管理`goroutine`context包基本使用
//服务器会为每个程序创建一个根Context实例,
//goroutine接受根context的一个派生Context对象
//goroutine通过 context.Done()方法监听取消信号
//例子,WithCancel()的使用
//如何优雅地关闭一个goroutine
package main
import (
"context"
"fmt"
"time"
)
func f1(ctx context.Context) {
LOOPUP:
for {
fmt.Println("我在执行")
time.Sleep(time.Second)
//这里是使用select监听通道,如果发现ctx.done()中有值,则直接跳出循环
select {
case
break LOOPUP
default:
}
}
}
func main() {
//创建一个取消信号的根context实例
ctx,cancelFunc :=context.WithCancel(context.Background())
go f1(ctx)
time.Sleep(time.Second*5)
//运行5秒后,发送退出信号
cancelFunc()
}
//也可以使用WithDeadline() 指定到期时间触发
nowtime :=time.Now().Add(time.Second*3) //当前时间+3秒
//3秒后停止
//这里的时间是一个time类型
ctx,_:=context.WithDeadline(context.Background(),nowtime)
go f1(ctx)
//也可以指定WithTimeout(),在多少秒后执行退出
//这里的时间是一个time.Duration类型,用法一样
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
redis的基本操作
以下的命令只是简单演示几个常用的,redis里的命令,这个包都是支持的
创建Redis连接
package main
import (
"context"
"fmt"
"github/go-redis/redis/v8"
)
//定义一个根context对象
var ctx=context.Background()
var rdb *redis.Client
//创建连接对象,底层是使用的链接池
func init() {
rdb=redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
DB: 0,
})
}
字符串操作
//这里封装了一个函数,这里是基本的操作,别的命令都可以按这种写法实现
func redisString() {
//设置值
err :=rdb.Set(ctx,"set1","name1",0).Err()
fmt.Println(err)
//获取值
vaule ,_:=rdb.Get(ctx,"set1").Result()
fmt.Println("值是,",vaule)
//删除 删除成功 n>0
n,err :=rdb.Del(ctx,"set1").Result()
fmt.Println("删除,",n,err)
}
Hash操作
//hash操作
func redisHash() {
//写入数据
//第一种写法
err:=rdb.HSet(ctx,"hash1","name","tom","age",18).Err()
//第二种
err=rdb.HSet(ctx,"hash2",map[string]interface{}{"name":"tom2","age":18}).Err()
//第三种也可以使用切片来传入,但是值得是一样的类型
err=rdb.HSet(ctx,"hash3",[]string{"name","tome3","age","182"}).Err()
//获取值
res,_:=rdb.HGet(ctx,"hash1","name").Result()
fmt.Println(res)
//获取所有的信息 值
var reslutl map[string]string
reslutl,err=rdb.HGetAll(ctx,"hash2").Result()
fmt.Println(reslutl,err)
n,_:=rdb.HLen(ctx,"hash2").Result()
fmt.Println("key的数量",n)
}
Lists列表操作
//可以使用列表实现,队列或栈的操作,也可以使用QQ账号出售平台brpop或blpop实现阻塞队列,这里就不写了
func redisLists() {
//向列表添加值
//err :=rdb.LPush(ctx,"list1","name1","name2","name3").Err()
//fmt.Println(err)
//查看列表中的元素
var result []string
result,_=rdb.LRange(ctx,"list1",0,-1).Result()
fmt.Println("列表元素的值",result)
//弹出元素
res,err :=rdb.LPop(ctx,"list1").Result()
fmt.Println("弹出的元素",res,err)
}
Set集合
//set集合,这个可以抽奖,去重等操作
func redisSet() {
//向集合里添加数据
//err :=rdb.SAdd(ctx,"set11","mem1","mem2","mem3").Err()
//err=rdb.SAdd(ctx,"set22","mem2","mem3","mem4").Err()
var res []string
//查看元素
res,_=rdb.SMembers(ctx,"set11").Result()
fmt.Println("查看元素",res)
//查看元素个数
n,_:=rdb.SCard(ctx,"set11").Result()
fmt.Println("查看元素个数",n)
//取交集
res ,_=rdb.SInter(ctx,"set11","set22").Result()
fmt.Println("交集",res)
//取并集
res ,_=rdb.SDiff(ctx,"set11","set22").Result()
fmt.Println("并集",res)
//取全集
res,_=rdb.SUnion(ctx,"set11","set22").Result()
fmt.Println("全集",res)
//删除指定元素
n,err :=rdb.SRem(ctx,"set11","mem1").Result()
fmt.Println(n,err)
//随机弹出
str:=rdb.SPop(ctx,"set22").Err()
fmt.Println(str)
}
Zset有序集合操作
//这个比较麻烦点,但是不难
func redisZset() {
//添加带分数的元素
//err :=rdb.ZAdd(ctx,"zset1",&redis.Z{Score: 50,Member: "tom1"},&redis.Z{Score: 60,Member: "tom2"}, &redis.Z{Score: 70,Member: "tom3"},&redis.Z{Score: 70,Member: "tom4"}).Err()
//_=rdb.ZAdd(ctx,"zset2",&redis.Z{Score: 100,Member: "tom4"},&redis.Z{Score: 90,Member: "tom5"},&redis.Z{Score: 85,Member: "tom6"}).Err()
//fmt.Println(err)
//查看集合里的元素
//var res []string
//res ,_=rdb.ZRange(ctx,"zset1",0,-1).Result()
////参数,通过分数查询
//res,_=rdb.ZRangeByScore(ctx,"zset1",&redis.ZRangeBy{
//Min: "0",
//Max: "90",
//Offset: 0,
//Count: 0,
//}).Result()
//fmt.Println(res)
//var res2 []redis.Z
////带分数查询
//res2,_=rdb.ZRangeArgsWithScores(ctx,redis.ZRangeArgs{
//Key: "zset1",
//Start: 0,
//Stop: -1,
//ByScore: false,
//ByLex: false,
//Rev: true,
//Offset: 0,
//Count: 0,
//}).Result()
//fmt.Println("集合中的元素",res2)
//交集
var res []string
res ,_=rdb.ZInter(ctx,&redis.ZStore{
Keys: []string{"zset1","zset2"},
Weights: nil,
Aggregate: "min",//这里 取值有,sum,min,max
}).Result()
fmt.Println("交集的数据",res)
var res2 []redis.Z
res2 ,_=rdb.ZInterWithScores(ctx,&redis.ZStore{
Keys: []string{"zset1","zset2"},
Weights: nil,
Aggregate: "max",//取交集分值大的那个值
}).Result()
fmt.Println("交集带分数的数据",res2)
//并集
res,_=rdb.ZDiff(ctx,"zset1","zset2").Result()
fmt.Println("并集",res)
}
PS:
这里只是列出了常用的基本数据结构,还有些别的命令没有写,比如关于地理位置的Geo,和bitmaps和redis事务,在这个包中都是支持的,由于篇幅有 限,这里就不写了
如果有需要redis场景实战的pdf,可以查看评论区的留言