博客列表 >GO语言中Redis的相关知识记录

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

Smile
Smile原创
2021年12月11日 14:39:04500浏览

  最近看到这个

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议