文件 v1.0.0

設定

本頁列出傳入 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

Email

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()
EN