設定
本頁列出傳入 New 的 Config 各欄位、預設值,以及無效值如何被修正。
Config
type Config struct {
Redis *Redis `json:"redis"`
Log *Log `json:"log,omitempty"`
Option *Options `json:"option,omitempty"`
Email *EmailConfig `json:"email,omitempty"`
}
| 欄位 | 必要 | 為 nil 時 |
|---|---|---|
Redis |
是 | New 在 Ping 成功時 panic(sync.go:51 nil pointer);Ping 失敗時首次落檔 panic |
Log |
否 | 套用全部日誌預設值 |
Option |
否 | 套用全部選項預設值 |
Email |
否 | 無影響(目前版本不寄信) |
Redis 為 nil 時,initRedis 只在函式內的副本補上預設值,實例保存的 Config.Redis 仍是 nil,之後存取 Redis.DB 即 panic。即使使用全部預設值,也要傳入 &redisFallback.Redis{}。
Redis
| 欄位 | 預設值 | 無效值處理 |
|---|---|---|
Host |
localhost |
空字串 → localhost |
Port |
6379 |
≤ 0 或 > 65535 → 6379 |
Password |
"" |
— |
DB |
0 |
< 0 或 > 15 → 0 |
DB 同時決定本地檔案子目錄 {DBPath}/{DB}。
Options
| 欄位 | 預設值 | 影響 |
|---|---|---|
DBPath |
./files/redisFallback/db |
本地 JSON 檔根目錄;{DBPath}/{DB} 必須在啟動前存在,否則無法進入正常模式 |
MaxRetry |
3 |
Get/Set 存取 Redis 的嘗試次數,用盡即切入 fallback |
MaxQueue |
1000 |
Fallback 寫檔佇列長度;佇列滿時 Set 改為同步寫檔 |
TimeToWrite |
3s |
Fallback 批次寫檔間隔;也是 Set 到落檔的最大延遲 |
TimeToCheck |
1m |
健康檢查 Ping 間隔;也是 Redis 恢復到被偵測的最大延遲 |
所有數值欄位 ≤ 0 時套用預設值。
Log
型別別名自 github.com/pardnchiu/go-logger v0.2.0 的 Log:
| 欄位 | 預設值 | 說明 |
|---|---|---|
Path |
./logs/redisFallback |
日誌目錄,內含 debug.log、output.log、error.log |
Stdout |
false |
同時輸出到標準輸出 |
MaxSize |
16 * 1024 * 1024(16 MiB) |
單檔大小上限(位元組) |
MaxBackup |
5 |
輪替保留檔數 |
Type |
text |
text 或 json |
EmailConfig 有 Host、Port、Username、Password、From、To、CC、Subject、Body 欄位,但寄信呼叫在原始碼中被註解(sync.go:26),設定後不會有任何效果。
調整建議
| 目標 | 調整 |
|---|---|
| Redis 恢復後更快回到正常模式 | 降低 TimeToCheck |
| Fallback 期間降低程序崩潰時的資料遺失 | 降低 TimeToWrite |
| 降低 Redis 抖動時誤切 fallback | 提高 MaxRetry(重試之間沒有等待,效果有限) |
完整範例
rf, err := redisFallback.New(redisFallback.Config{
Redis: &redisFallback.Redis{
Host: "10.0.0.5",
Port: 6379,
Password: os.Getenv("REDIS_PASSWORD"),
DB: 2,
},
Log: &redisFallback.Log{
Path: "/var/log/myapp/redis-fallback",
Stdout: true,
},
Option: &redisFallback.Options{
DBPath: "/var/lib/myapp/redis-fallback",
MaxRetry: 3,
MaxQueue: 5000,
TimeToWrite: 1 * time.Second,
TimeToCheck: 15 * time.Second,
},
})
if err != nil {
log.Fatal(err)
}
defer rf.Close()