ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis 在Go项目中的集成和同一管理 [打印本页]

作者: 悠扬随风    时间: 2024-12-15 11:09
标题: Redis 在Go项目中的集成和同一管理
本节我们在项目中安装和集成 go-redis,让项目能访问Redis,反面实战项目中的用户认证体系会依靠Redis来实现,像Token、Session这些都是在Redis中存储的。
  本节大纲如下:‍‍
  

  Redis的使用场景有不少,不外有一点必要提示的是别把Redis当数据库用哦。
     这里分享一篇 Redis应用场景汇总,内里罗列了十几个场景,大家有兴趣的可以看一下。
    go-redis 的安装和配置

  在我们的Go项目里访问Redis使用的是 go-redis 这个包,之前也见过一些项目使用redigo 来访问Redis,不外redigo已经停止维护了,以是就不思量使用它了。
  安装 go-redis 使用以下下令
  1. go get github.com/redis/go-redis/v9
复制代码
安装过程中会向项目依靠中添加下面这些包,在gomod 文件中也会看到它们的身影。
  
  依靠下载完成后,我们先不发急去初始化它,还是先把干系的配置先在配置文件里写好。在 applicaiton.dev.yaml 增加Redis干系配置。
  1. redis: # 记得更改成自己的连接配置
  2.   addr: 127.0.0.1:31379
  3.   password: 123456
  4.   pool_size: 10
  5.   db: 0
复制代码
其他两个情况的配置文件发起也先加上,避免配置文件之间布局和字段相差太多,等有测试和生产情况后再把配置调解过去即可。
  配置添加完后,我们在 config.go 中增加 Redis 这些配置字段的对应的范例定义
  1. var (
  2.  ...
  3.  Redis    *redisConfig
  4. )
  5. // Redis 配置
  6. type redisConfig struct {
  7.  Addr     string `mapstructure:"addr"`
  8.  Password string `mapstructure:"password"`
  9.  PoolSize int    `mapstructure:"pool_size"`
  10.  DB       int    `mapstructure:"db"`
  11. }
复制代码
同时也在 bootstrap.go 中把config文件中的redis配置字段映射到 redisConfig 范例的变量 config.Redis上
  1. func init() {
  2.  env := os.Getenv("ENV")
  3.  vp := viper.New()
  4.     ...
  5.     
  6.  vp.UnmarshalKey("redis", &Redis)
  7. }
复制代码
配置做好后,接下来我们在 dal/cache 目录中新建redisinit.go 文件,在其中对go-redis客户端进行初始化
  1. var redisClient *redis.Client
  2. func Redis() *redis.Client {
  3.  return redisClient
  4. }
  5. func init() {
  6.  redisClient = redis.NewClient(&redis.Options{
  7.   Addr:         config.Redis.Addr,
  8.   Password:     config.Redis.Password,
  9.   DB:           config.Redis.DB,
  10.   PoolSize:     config.Redis.PoolSize,
  11.   DialTimeout:  10 * time.Second,
  12.   ReadTimeout:  30 * time.Second,
  13.   WriteTimeout: 30 * time.Second,
  14.   PoolTimeout:  30 * time.Second,
  15.  })
  16.  
  17.  if err :=redisClient.Ping(context.Background()).Err(); err != nil {
  18.   // 连接不上redis 让项目停止启动
  19.   panic(err)
  20.  }}
复制代码
跟初始化GORM时一样,如果你不想用Go的init机制,这里可以把这个初始化方法修改名成InitRedis,到main函数中去调用它来手动完成初始化。
  Redis Key 的管理

  我们在使用Redis的时候,最好把Key 放在项目里同一的地方进行管理,同时在命名时给Key加上包含业务、项目、模块信息的前缀名,通过签证在盘标题的时候我们最最少能快速定位到缓存是哪个项目写进去的。
  我在平时维护项目中被 Redis 搞的头大的大部分情况是,很多旧代码在A项目里缓存了个什么数据,然后到下游的B项目再去读这个数据,根据缓存里数据的状态执行不同的逻辑分支。
  有的时候监控系统陈诉B项目出了Bug,盘标题看到从Redis里读取到的数据跟预想的不一样,一般人都会先在B项目中Debug,看下缓存设置的程序是不是有标题,但是针对这种情况把整个B项目搜遍也没发现缓存是从那里存进去的。 
  以是 Redis Key 的命名不能太随意,最好包含设置缓存的项目名、所属业务等能确定缓存泉源的信息。
  我们在项目的 common/enum 目录中新增rediskey.go 在其中对Redis 缓存的 Key 进行同一管理
  1. / Redis Key的格式为:
  2. //   项目名:模块名:键名
  3. const (
  4.  REDIS_KEY_DEMO_ORDER_DETAIL = "GOMALL:DEMO:ORDER_DETAIL_%s"
  5. )
复制代码
这里先定义一个测试用的Redis缓存的键名。
  
  在使用到这个 Redis 缓存的方法中可以来拿业务标识(比如订单号) 拼装出完备的Redis Key
  1. redisKey := fmt.Sprintf(enum.REDIS_KEY_DEMO_ORDER_DETAIL, demoOrder.OrderNo)
复制代码
Redis怎么做日志链路追踪

  和在项目中集成ORM使用数据库时一样,除了关注常规的功能外,我们还要关注组件集成进项目后的可观测性。最底子的保障观测性的方式是组件日志整合到应用日志,并且通过traceId、reqeustId等方式讲它们归因到对应的请求上。
  关于这部分日志整合和链路追踪的内容,请扫码订阅专栏后阅读完备版。
  
  

  

  

  专栏配套的项目有完备的实当代码,订阅后加入项目访问 https://github.com/go-study-lab/go-mall/compare/c8...c9 能看本章节的详细代码。
  

  
专栏分为五大部分,主要内容架构如下(已更新32节)

  
     
   
  
扫描上方二维码大概访问 https://xiaobot.net/p/golang 马上订阅

  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4