欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-17 19:45:41
...

  最近看到这个

  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,可以查看评论区的留言