成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 在 Go 項目中的集成和統一管理

開發 項目管理
在我們的Go項目里訪問Redis使用的是 go-redis 這個包,之前也見過一些項目使用redigo 來訪問Redis,不過redigo已經停止維護了,所以就不考慮使用它了。

本節我們在項目中安裝和集成 go-redis,讓項目能訪問Redis,后面實戰項目中的用戶認證體系會依賴Redis來實現,像Token、Session這些都是在Redis中存儲的。

本節大綱如下:

圖片圖片

Redis的使用場景有不少,不過有一點需要提醒的是別把Redis當數據庫用哦。

這里分享一篇 Redis應用場景匯總,里面羅列了十幾個場景,大家有興趣的可以看一下。

go-redis 的安裝和配置

在我們的Go項目里訪問Redis使用的是 go-redis 這個包,之前也見過一些項目使用redigo 來訪問Redis,不過redigo已經停止維護了,所以就不考慮使用它了。

安裝 go-redis 使用以下命令

go get github.com/redis/go-redis/v9

安裝過程中會向項目依賴中添加下面這些包,在gomod 文件中也會看到它們的身影。

圖片圖片

依賴下載完成后,我們先不著急去初始化它,還是先把相關的配置先在配置文件里寫好。在 applicaiton.dev.yaml 增加Redis相關配置。

redis: # 記得更改成自己的連接配置
  addr: 127.0.0.1:31379
  password: 123456
  pool_size: 10
  db: 0

其他兩個環境的配置文件建議也先加上,避免配置文件之間結構和字段相差太多,等有測試和生產環境后再把配置調整過去即可。

配置添加完后,我們在 config.go 中增加 Redis 這些配置字段的對應的類型定義

var (
 ...
 Redis    *redisConfig
)

// Redis 配置
type redisConfig struct {
 Addr     string `mapstructure:"addr"`
 Password string `mapstructure:"password"`
 PoolSize int    `mapstructure:"pool_size"`
 DB       int    `mapstructure:"db"`
}

同時也在 bootstrap.go 中把config文件中的redis配置字段映射到 redisConfig 類型的變量 config.Redis上

func init() {
 env := os.Getenv("ENV")
 vp := viper.New()
    ...
    
 vp.UnmarshalKey("redis", &Redis)
}

配置做好后,接下來我們在 dal/cache 目錄中新建redisinit.go 文件,在其中對go-redis客戶端進行初始化

var redisClient *redis.Client

func Redis() *redis.Client {
 return redisClient
}

func init() {
 redisClient = redis.NewClient(&redis.Options{
  Addr:         config.Redis.Addr,
  Password:     config.Redis.Password,
  DB:           config.Redis.DB,
  PoolSize:     config.Redis.PoolSize,
  DialTimeout:  10 * time.Second,
  ReadTimeout:  30 * time.Second,
  WriteTimeout: 30 * time.Second,
  PoolTimeout:  30 * time.Second,
 })
 
 if err :=redisClient.Ping(context.Background()).Err(); err != nil {
  // 連接不上redis 讓項目停止啟動
  panic(err)
 }}

跟初始化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 進行統一管理

/ Redis Key的格式為:
//   項目名:模塊名:鍵名

const (
 REDIS_KEY_DEMO_ORDER_DETAIL = "GOMALL:DEMO:ORDER_DETAIL_%s"
)

這里先定義一個測試用的Redis緩存的鍵名。

  • GOMALL:DEMO:ORDER_DETAIL_%s

Key的格式為 項目名:模塊名:鍵名,你的公司大的話還可以在最前面加一個業務名,免得項目名重復了。

項目名:GOMALL

模塊名:DEMO (因為是演示,正常情況下是ORDER、USER 這種模塊名)

鍵名:ORDER_DETAIL_%s

在使用到這個 Redis 緩存的方法中可以來拿業務標識(比如訂單號) 拼裝出完整的Redis Key

redisKey := fmt.Sprintf(enum.REDIS_KEY_DEMO_ORDER_DETAIL, demoOrder.OrderNo)

Redis怎么做日志鏈路追蹤

和在項目中集成ORM使用數據庫時一樣,除了關注常規的功能外,我們還要關注組件集成進項目后的可觀測性。最基礎的保障觀測性的方式是組件日志整合到應用日志,并且通過traceId、reqeustId等方式講它們歸因到對應的請求上。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2009-02-25 18:32:39

虛擬化IT服務器虛擬化

2019-05-20 11:54:51

Google云AWS CloudKubernetes

2013-12-16 09:10:35

混合網絡虛擬化統一管理

2013-11-13 23:14:57

惠普OneView數據中心

2023-12-06 08:00:41

2009-05-05 14:25:49

服務器管理IBM

2010-09-26 09:59:42

IP網絡SAN博科

2010-12-09 15:23:30

2011-08-02 14:18:22

2013-01-17 14:40:19

公有云私有云云操作系統

2011-10-19 09:57:11

2012-03-30 10:41:52

imo

2009-09-10 22:46:37

統一管理系統IP可視化華為

2013-01-18 14:32:05

云操作系統

2010-05-10 09:02:50

Visual Stud

2023-01-16 09:46:39

2011-08-02 13:51:33

2011-08-02 14:52:56

流量控制路由器飛星魚

2011-10-19 09:39:25

2011-12-31 16:26:34

三重保護信息防泄漏IP-guard
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区在线播放 | 日韩精品久久 | 99久视频| 日韩中文字幕在线播放 | 成人一区二区三区 | 久久精品视频在线观看 | 四色成人av永久网址 | 性网站免费 | 色秀网站 | 天天操天天拍 | 久草资源| 午夜成人免费视频 | 精品久久久久久久久久久久 | 日韩久久综合 | 七七婷婷婷婷精品国产 | 国产精品欧美一区二区三区 | 国产色婷婷精品综合在线手机播放 | 超碰成人av| 欧美视频第三页 | 日韩精品极品视频在线观看免费 | 亚洲综合视频 | 久久久久一区二区三区 | 日韩福利在线 | 国产乱码精品一区二区三区中文 | 超碰在线久 | 精品粉嫩aⅴ一区二区三区四区 | 国产精品激情在线 | 亚洲国产成人精品一区二区 | 午夜精品导航 | 手机在线观看 | 在线免费av电影 | 免费黄色录像视频 | 日韩精品一区二区在线 | 国产精品久久久久一区二区三区 | 99久久99 | 成人国产毛片 | 久久99精品视频 | 日韩在线电影 | 免费观看的av | 日本一区二区三区在线观看 | 久久一区二区三区四区 |