侧边栏壁纸
博主头像
uvdream博主等级

一切皆有可能!

  • 累计撰写 37 篇文章
  • 累计创建 21 个标签
  • 累计收到 18 条评论

go操作redis

uvdream
2022-03-24 / 0 评论 / 12 点赞 / 836 阅读 / 3,736 字
温馨提示:
本文最后更新于 2022-04-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

准备redis环境

docker安装5.0.7

docker search redis //查找redis
docker pull redis:5.0.7

启动redis

docker run --name redis507 -p 6379:6379 -d redis:5.0.7

启动一个redis-cli

docker run -it --network host --rm redis:5.0.7 redis-cli

连接

func initClient() (err error) {
  rdb = redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
    Password: "",
    DB: 0,
  })
  _,err=rdb.Ping().Result()
  if err != nil {
    fmt.Println("连接失败",err)
    return err
  }
  fmt.Println("连接成功")
  return nil
}

基本使用

func redisExample()  {
  err:=rdb.Set("name","zhangsan",0).Err()
  if err != nil {
    fmt.Println("设置失败",err)
    return
  }
  val,err:=rdb.Get("name").Result()
  if err != nil {
    fmt.Println("获取失败",err)
    return
  }
  fmt.Println("获取成功",val)
  val2,err:=rdb.Get("name2").Result()
  if err == redis.Nil {
    fmt.Println("该记录不存在",err)
    return
  }else if err!=nil{
    fmt.Println("获取失败",err)
    return
  }else{
    fmt.Println("获取成功",val2)
  }
}

  • 结果
获取成功 zhangsan
该记录不存在 redis: nil

zset示例

func redisExample2() {
  fmt.Println("--------zset示例---------")
  zsetKey := "language_rank"
  languages := []redis.Z{
    redis.Z{Score: 90.0, Member: "golang"},
    redis.Z{Score: 80.0, Member: "python"},
    redis.Z{Score: 70.0, Member: "java"},
    redis.Z{Score: 60.0, Member: "c"},
  }
  num, err := rdb.ZAdd(zsetKey, languages...).Result()
  if err != nil {
    fmt.Println("添加失败", err)
    return
  }
  fmt.Println("添加成功", num)
  //  把golang分数加10
  newScore, err := rdb.ZIncrBy(zsetKey, 10.0, "golang").Result()
  if err != nil {
    fmt.Println("更新失败", err)
    return
  }
  fmt.Println("更新成功,golang新的分数:", newScore)
  //  取分数最高的3个
  res, err := rdb.ZRevRangeWithScores(zsetKey, 0, 2).Result()
  if err != nil {
    fmt.Println("取值失败", err)
    return
  }
  fmt.Println("取前3名成功", res)
  for _, z := range res {
    fmt.Println("每一项---", z.Member, z.Score)
  }
  //  取95-100
  op := redis.ZRangeBy{
    Min: "95",
    Max: "100",
  }
  res, err = rdb.ZRangeByScoreWithScores(zsetKey, op).Result()
  if err != nil {
    fmt.Println("取95-100值失败", err)
    return
  }
  fmt.Println("取95-100值成功", res)
  for _, z := range res {
    fmt.Println("每一项---", z.Member, z.Score)
  }
}

  • 结果
--------zset示例---------
添加成功 0
更新成功,golang新的分数: 100
取前3名成功 [{100 golang} {80 python} {70 java}]
每一项--- golang 100
每一项--- python 80
每一项--- java 70
取95-100值成功 [{100 golang}]
每一项--- golang 100

v8版本相关

最新版本的go-redis库的相关命令都需要传递context.Context参数,例如:

package main

import (
  "context"
  "fmt"
  "time"

  "github.com/go-redis/redis/v8" // 注意导入的是新版本
)

var (
  rdb *redis.Client
)

// 初始化连接
func initClient() (err error) {
  rdb = redis.NewClient(&redis.Options{
    Addr:     "localhost:16379",
    Password: "",  // no password set
    DB:       0,   // use default DB
    PoolSize: 100, // 连接池大小
  })

  ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  defer cancel()

  _, err = rdb.Ping(ctx).Result()
  return err
}

func V8Example() {
  ctx := context.Background()
  if err := initClient(); err != nil {
    return
  }

  err := rdb.Set(ctx, "key", "value", 0).Err()
  if err != nil {
    panic(err)
  }

  val, err := rdb.Get(ctx, "key").Result()
  if err != nil {
    panic(err)
  }
  fmt.Println("key", val)

  val2, err := rdb.Get(ctx, "key2").Result()
  if err == redis.Nil {
    fmt.Println("key2 does not exist")
  } else if err != nil {
    panic(err)
  } else {
    fmt.Println("key2", val2)
  }
  // Output: key value
  // key2 does not exist
}

go连接哨兵

func initClient()(err error){
  rdb := redis.NewFailoverClient(&redis.FailoverOptions{
    MasterName:    "master",
    SentinelAddrs: []string{"x.x.x.x:26379", "xx.xx.xx.xx:26379", "xxx.xxx.xxx.xxx:26379"},
  })
  _, err = rdb.Ping().Result()
  if err != nil {
    return err
  }
  return nil
}

go连接Redis集群

func initClient()(err error){
  rdb := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
  })
  _, err = rdb.Ping().Result()
  if err != nil {
    return err
  }
  return nil
}
0

评论区