专业编程基础技术教程

网站首页 > 基础教程 正文

GO语言中Redis的相关知识记录

ccvgpt 2024-11-27 12:07:01 基础教程 1 ℃

最近看到这个github.com/go-redis/redis/v8已经更新了,今天下载下来用用

这里分享一个关于redis实战的书籍,分享链接,可以查底下留言获取

GO语言中Redis的相关知识记录

安装Redis包

go get github.com/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 <-ctx.Done():

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.com/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列表操作

//可以使用列表实现,队列或栈的操作,也可以使用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,可以查看评论区的留言

最近发表
标签列表