go-zero&go web集成redis实战

前言

上一篇:go-zero&go web集成JWT和cobra命令行工具实战

从零开始基于go-zero搭建go web项目实战-03集成redis实战
源码仓库地址 源码 https://gitee.com/li_zheng/treasure-box

golang redis 客户端

Go-Redis 地址:

  • GitHub: https://github.com/redis/go-redis
  • 中文:https://redis.uptrace.dev/zh/

特点/特性

  • 支持单机Redis Server、Redis Cluster、Redis Sentinel、Redis分片服务器
  • go-redis会根据不同的redis命令处理成指定的数据类型,不必进行繁琐的数据类型转换
  • go-redis支持管道(pipeline)、事务、pub/sub、Lua脚本、mock、分布式锁等功能

安装依赖
没有使用最新版本v9
go get github.com/go-redis/redis/v8

非go-zero配置go-redis

初始化客户端

	// 单机版
	rdb := redis.NewClient(&redis.Options{
		Addr:         "zachary.ink:6677",
		Password:     "", // no password set
		DB:           0,  // use default DB
		MaxRetries:   3,  // 最大重试次数
		MinIdleConns: 8,  // 空闲链接
	})
	// 集群
	crdb := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: []string{
			"localhost:6379",
			"localhost:6380",
			"localhost:6381",
		}, // 集群IP:PORT
		Password:     "", // 密码
		MaxRetries:   3,  // 最大重试次数
		MinIdleConns: 8,  // 空闲链接
	})
	// sentinel哨兵-服务器客户端: 连接到 哨兵模式 管理的服务器
	frdb := redis.NewFailoverClient(&redis.FailoverOptions{
		MasterName:    "master-name",
		SentinelAddrs: []string{":9126", ":9127", ":9128"},
	})
	// 从 go-redis v8 版本开始,可以使用 NewFailoverClusterClient 把只读命令路由到从节点,
	// NewFailoverClusterClient 借助了 Cluster Client 实现,不支持 DB 选项(只能操作 DB 0)
	frdb := redis.NewFailoverClusterClient(&redis.FailoverOptions{
		MasterName:    "master-name",
		SentinelAddrs: []string{":9126", ":9127", ":9128"},
		// 你可以选择把只读命令路由到最近的节点,或者随机节点,二选一
		// RouteByLatency: true,
		// RouteRandomly: true,
	})
	// entinel哨兵-哨兵服务器客户端
	// 哨兵客户端本身用于连接哨兵服务器,可以从哨兵上获取管理的 redis 服务器信息
	srdb := redis.NewSentinelClient(&redis.Options{
		Addr: ":9126",
	})
	addr, err := srdb.GetMasterAddrByName(ctx, "master-name").Result()

更多客户端配置查看,官方文档

操作命令

go-redis提供的API命名和redis命令几乎一样,上手非常简单,j简单列举常用的几个

func ExampleClient() {
	// 初始化客户端
	rdb := redis.NewClient(&redis.Options{
		Addr:     "zachary.ink:6677",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
	// set命令
	err := rdb.Set(ctx, "key", "value", 0).Err()
	if err != nil {
		panic(err)
	}
	// get命令
	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)
	}
	// hash相关
	valInt, err := rdb.HSet(ctx, "myhash", "key1", "value1", "key2", "value2").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash key1 num ", valInt)

	val, err = rdb.HGet(ctx, "myhash", "key1").Result()
	if err != nil {
		panic(err)
	}
	// 获取hash map 所有 key value
	mval, err := rdb.HGetAll(ctx, "myhash").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash ", mval)
	// 删除指定key
	del, err := rdb.Del(ctx, "myhash").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash del ", del)
	
	// 关闭链接
	err = rdb.Close()
	if err != nil {
		panic(err)
	}
}

其他常用命令

	// SETEX key seconds value
	rdb.SetEX(ctx, "key-ex", "time expire", time.Second*5)
	// SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX] [GET]
	rdb.SetNX(ctx, "key-ex", "time expire", 0)
	// list
	rdb.RPush(ctx, "key-list", "val1", "val2")
	rdb.LSet(ctx, "key-list", 1, "xxx")
	rdb.LPop(ctx, "key-list")

go-zero中使用go-redis

go-zero中使用redis支持单机版和集群版两种模式,暂不支持 sentinel,本文版本:go-zero v1.5.3

增加redis相关配置

在全局配置struct中增加Redis配置:

type Config struct {
	rest.RestConf
	// 增加redis配置,导入包: github.com/zeromicro/go-zero/core/stores/redis
	Redis redis.RedisConf `json:",optional"`
	Auth  struct {
		AccessSecret string
		AccessExpire int64
	}
}

对应的yaml文件中增加配置信息

Name: tbox-api
Host: 0.0.0.0
Port: 8888
# 接口超时时间30s
Timeout: 30000
Auth:
  #jwt密钥
  AccessSecret: "12345678"
  #过期时间
  AccessExpire: 10000
Log:
  #日志格式使用行模式
  Encoding: plain
  #日志时间显示格式
  TimeFormat: 2006-01-02 15:04:05.000
  # 关闭Stat
  Stat: false
Middlewares:
  Trace: false
  Metrics: false
  Log: false
# redis配置
Redis:
  # 如果是 redis cluster 则为 ip1:port1,ip2:port2,ip3:port3...
  Host: localhost:6379
  # 这里密码如果是纯数字需要加引号
  Pass: abc23132
  # 单机模式
  Type: node
  # true 检查链接是否可用,不可用报错
  NonBlock: false

服务启动Ctx上下文初始化redis实例

run_cmd 中的 runServer 方法,以 server.StartWithOpts()的方式启动服务,会进行上下文初始化,具体代码可参考:cmd/run_cmd.go:52 runServer 方法

func Init(svr *http.Server) {
	initLock.Do(func() {
		initRedisIns()
		initDb()
		initOther()
		sCtx.IsInit = true
	})
}

func initRedisIns() {
	if len(sCtx.Config.Redis.Host) == 0 {
		return
	}
	logx.Infof("Initializing redis ...")
	// 设置redis慢请求阈值
	redis.SetSlowThreshold(time.Millisecond * 500)
	// redis实例对象缓存在上下文中
	sCtx.Redis = redis.MustNewRedis(sCtx.Config.Redis)
	logx.Infof("Redis Initialized.")
}

使用命令

svc.GetServiceContext().Redis 或者 svc.Redis() 获取redis客户端对象,进行命令操作,具体代码位置: \internal\svc\ctx.go
go-zero&go web集成redis实战_第1张图片
go-zero&go web集成redis实战_第2张图片
go-zero对go-redis的命令进行了简单的封装,使用起来更加便利

源码

源码仓库地址: https://gitee.com/li_zheng/treasure-box

下一章

1、go-zero&go web集成gorm、mysql实战
2、实现简单的学生信息CRUD测试

你可能感兴趣的:(Golang,Web实战,golang,go-zero,go-redis)