Documentation ¶
Index ¶
- Constants
- type Behave
- type Behavior
- type Del
- type Exist
- type Find
- type Get
- type GetEx
- type Incr
- type IncrData
- type Index
- type Keys
- type Lock
- type Major
- type MajorSubmit
- type Metaer
- type Minor
- type MinorSubmit
- type Mixed
- type MongoURI
- type RedisURI
- type Redmomgr
- func (this *Redmomgr) AddMajor(majorName string, uri RedisURI) (major *Major, err error)
- func (this *Redmomgr) AddMinor(minorName string, uri MongoURI, dbName string) (minor *Minor, err error)
- func (this *Redmomgr) AddMixed(mixedName, majorName, minorName string) (mixed *Mixed, err error)
- func (this *Redmomgr) Finalize()
- func (this *Redmomgr) GetMajor(majorName string) *Major
- func (this *Redmomgr) GetMinor(minorName string) *Minor
- func (this *Redmomgr) GetMixed(mixedName string) *Mixed
- type Save
- type Saver
- type Set
- type SetEx
- type SetNX
- type Submit
- type Unlock
Constants ¶
const ( Timeout = time.Second * 30 // redis超時時間 RedisNil = "" // redis回應空字串, 通常在GET命令找不到索引時, 會以此字串回報給使用者 RedisOk = "OK" // redis回應完成, 通常在SET命令順利完成後, 會以此字串回報給使用者 KeepTTL = redis.KeepTTL // 不更動逾期時間 )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Behave ¶
type Behave struct {
// contains filtered or unexported fields
}
Behave 行為資料
func (*Behave) Initialize ¶
func (this *Behave) Initialize(ctx context.Context, major MajorSubmit, minor *MinorSubmit)
Initialize 初始處理
type Behavior ¶
type Behavior interface { // Initialize 初始處理 Initialize(ctx context.Context, major MajorSubmit, minor *MinorSubmit) // Prepare 準備處理 Prepare() error // Complete 完成處理 Complete() error }
Behavior 行為介面, 當建立行為時, 需要實現此介面, 建議可以把 Behave 組合進行為結構中, 可以省去初始處理的實作; 設計行為時, 有以下的設計規範
- 主要資料庫的情況下: 由於主要資料庫會用管線機制執行, 因此通常會在 Prepare 新增管線命令, 然後在 Complete 檢查執行是否符合預期
- 次要資料庫的情況下: 由於次要資料庫會以常規方式執行, 因此通常 Prepare 不會有內容, 然後在 Complete 執行資料庫命令並且檢查執行是否符合預期
- 錯誤處理: 當資料庫失敗時才會回傳錯誤, 若是邏輯錯誤(例如資料不存在), 就不應該回傳錯誤, 而是把結果記錄下來提供外部使用
type Del ¶
type Del struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Key string // 索引值 // contains filtered or unexported fields }
Del 刪除行為, 以索引字串與資料到主要/次要資料庫中刪除資料, 使用上有以下幾點須注意
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Key 並且不能為空字串
type Exist ¶
type Exist struct { Behave // 行為物件 Meta Metaer // 元資料 Key []string // 索引列表 Count int // 存在的索引數量 // contains filtered or unexported fields }
Exist 查詢行為, 以索引列表到主要資料庫中查詢索引是否存在, 使用上有以下幾點須注意
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Key 並且不能為空列表
- 執行後可用 Count 來取得存在的索引數量
type Find ¶ added in v1.1.28
Find 搜尋行為, 以匹配字串到次要資料庫中取得索引, 使用上有以下幾點須注意
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Pattern 並且不能為空字串
- 執行後可用 Data 來取得資料
Pattern匹配規則 ¶
- 使用正則表達式來寫匹配字串
type Get ¶
type Get[T any] struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Key string // 索引值 Data *T // 資料物件 // contains filtered or unexported fields }
Get 取值行為, 以索引字串到主要/次要資料庫中取得資料, 不會影響主要資料庫中的資料的逾期時間, 使用上有以下幾點須注意
- 需要事先建立好資料結構, 並填寫到泛型類型T中, 請不要填入指標類型
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data, 如果為nil, 則內部程序會自己建立
- 執行後可用 Data 來取得資料
type GetEx ¶ added in v1.1.35
type GetEx[T any] struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Expire time.Duration // 逾期時間, 若為0表示不逾期, 若為-1或是 KeepTTL 則表示不更動逾期時間 Key string // 索引值 Data *T // 資料物件 // contains filtered or unexported fields }
GetEx 取值並設定逾期時間行為, 以索引字串到主要/次要資料庫中取得資料, 主要資料庫中的資料將會有逾期時間, 使用上有以下幾點須注意
- 需要事先建立好資料結構, 並填寫到泛型類型T中, 請不要填入指標類型
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Expire, 若不設置或是設置為0表示不逾期, 如果設為-1或是 KeepTTL 則表示不更動逾期時間
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data, 如果為nil, 則內部程序會自己建立
- 執行後可用 Data 來取得資料
type Incr ¶
type Incr struct { Behave // 行為物件 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Key string // 索引值 Data *IncrData // 資料物件 // contains filtered or unexported fields }
Incr 遞增行為, 以索引字串到主要/次要資料庫中遞增數值, 使用上有以下幾點須注意
- 執行前設定好 MinorEnable. 請注意! 遞增行為必定會在主資料庫中執行, 因此無法禁用主資料庫
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data 並且不能為空物件
- 由於遞增行為是以int64來運作, 因此使用時可能需要轉換
type Index ¶
type Index struct { Behave // 行為物件 Meta Metaer // 元資料 Name string // 索引名稱 Order int // 排序方向, 1表示順序, -1表示逆序 Unique bool // 是否唯一索引, 唯一索引的情況下, 索引值不允許重複 }
Index 建立索引行為, 到次要資料庫中建立索引, 使用上有以下幾點須注意
- 只有次要資料庫的操作會被索引影響, 當查詢的欄位符合索引時會自動生效
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Name, Order, Unique 並且要符合規範
type Keys ¶ added in v1.1.28
type Keys struct { Behave // 行為物件 Pattern string // 匹配字串 Data []string // 資料物件 // contains filtered or unexported fields }
Keys 搜尋行為, 以匹配字串到主要資料庫中取得索引, 使用上有以下幾點須注意
- 執行前設定好 Pattern 並且不能為空字串
- 執行後可用 Data 來取得資料
Pattern匹配規則 ¶
`*`: 匹配任意數量的字符(包括零個字符)
- 模式 `user:*` 匹配所有以 `user:` 開頭的鍵
- 模式 `*` 匹配所有鍵
`?`: 匹配任意一個字符
- 模式 `user:???` 匹配所有以 `user:` 開頭, 後面跟三個字符的鍵, 如 `user:abc`
`[]`: 匹配括號內的任意一個字符, 可以使用範圍來指定字符, 例如 [a-z] 匹配所有小寫字母
- 模式 `user:[abc]*` 匹配所有以 `user:` 開頭, 且接著是 a、b、或 c 的鍵, 如 `user:a123`、`user:b456`
`[^]`: 匹配不在括號內的任意一個字符(否定模式)
- 模式 `user:[^abc]*` 匹配所有以 `user:` 開頭, 且後面跟的第一個字符不是 a、b、或 c 的鍵, 如 `user:d123`
`\`: 用於轉義特殊字符, 使其作為普通字符匹配
- 模式 `user:\*` 匹配鍵 `user:*`, 而不是所有以 `user:` 開頭的鍵
其他範例 ¶
- `user:*`:匹配所有以 `user:` 開頭的鍵
- `user:?*`:匹配所有以 `user:` 開頭, 且後面至少有一個字符的鍵
- `user:[abc]*`:匹配所有以 `user:` 開頭, 且接著是 a、b、或 c 的鍵
- `user:[^abc]*`:匹配所有以 `user:` 開頭, 且接著的第一個字符不是 a、b、或 c 的鍵
注意事項 ¶
- Keys 命令的時間複雜度為O(N), 其中N是主要資料庫中的鍵的數量, 由於這個原因, Keys 命令在大數據集上運行時可能會導致性能問題, 因此在生產環境中應謹慎使用
type Lock ¶
Lock 鎖定行為, 以索引字串到主要資料庫中執行分布式鎖定, 避免同時執行客戶端動作, 使用上有以下幾點須注意
- 執行前設定好 Key 並且不能為空字串
- 鎖定完成後, 需要執行 Unlock 行為來解除鎖定
- 鎖定後會在 Timeout 之後自動解鎖, 避免死鎖
type Major ¶
type Major struct {
// contains filtered or unexported fields
}
Major 主要資料庫, 內部用redis實現的資料庫組件, 包含以下功能
- 取得執行物件: 取得資料庫執行器, 實際上就是redis管線
- 取得客戶端物件: 取得原生資料庫執行器, 可用來執行更細緻的命令
type Metaer ¶
type Metaer interface { // MajorKey 取得主要資料庫索引值 // 當使用到主要資料庫, 必須提供索引值 MajorKey(key any) string // MinorTable 取得次要資料庫表格名稱 // 當使用到次要資料庫, 必須提供表格名稱 MinorTable() string // MinorField 取得次要資料庫欄位名稱 // 當使用到次要資料庫時, 必須提供欄位名稱 MinorField() string // MinorKey 取得次要資料庫索引值 // 當使用到次要資料庫時, 必須提供索引值 MinorKey(key any) string }
Metaer 元資料介面, 提供主要/次要資料庫操作時所需的必要資訊
type Minor ¶
type Minor struct {
// contains filtered or unexported fields
}
Minor 次要資料庫, 內部用mongo實現的資料庫組件, 包含以下功能
- 取得執行物件: 取得資料庫執行器, 實際上就是mongo集合
- 取得客戶端物件: 取得原生客戶端執行器, 可用來執行更細緻的命令
- 取得資料庫物件: 取得原生資料庫執行器, 可用來執行更細緻的命令
type MinorSubmit ¶
type MinorSubmit struct {
// contains filtered or unexported fields
}
MinorSubmit 資料庫執行器
func (*MinorSubmit) Collection ¶
func (this *MinorSubmit) Collection(table string) *mongo.Collection
Collection 取得表格物件
func (*MinorSubmit) Operate ¶
func (this *MinorSubmit) Operate(table string, operate mongo.WriteModel) *MinorSubmit
Operate 新增批量操作
type Mixed ¶
type Mixed struct {
// contains filtered or unexported fields
}
Mixed 混合資料庫, 內部用主要與次要資料庫實現混合命令, 包含以下功能
- 取得執行物件: 取得資料庫執行器
type MongoURI ¶
type MongoURI string
MongoURI mongo連接字串, 選項字串語法如下
- mongodb://[username:password@]host1[:port1][,host2[:port2],...,hostN[:portN]]/[?options]]
語法中各組件的說明如下
- mongodb:// @必選 必須是 'mongodb://'
- [username:password@] @可選 指定連接時使用的帳號密碼
- host1[:port1][,host2[:port2],...,hostN[:portN]] @必選 指定連接位址與埠號, 如果要連接到分片叢集的話, 就需要設定多組位址與埠號 如果省略埠號的話, 就會使用mongo預設的埠號27017
- [?options] @可選 設定連接選項, 選項以'&'符號分隔, 例如: name=value&name=value
以下是連接選項說明, 選項中有關於時間值的單位都是毫秒
- connectTimeoutMS 連接超時時間, 預設值為30000
- timeoutMS 命令超時時間, 預設值為0, 0表示不會超時
- maxIdleTimeMS 連接閒置時間, 連接如果閒置超過此時間將會被刪除, 預設值為0, 0表示不刪除
- heartbeatFrequencyMS 心跳檢查時間, 預設值為10000
- socketTimeoutMS socket操作超時時間, 超時會導致失敗, 預設值為0, 0表示不會超時
- serverSelectionTimeoutMS 尋找伺服器超時時間
- minPoolSize 最小連接池大小, 預設值為0
- maxPoolSize 最大連接池大小, 預設值為100
- replicaSet 集群的副本集名稱, 副本集中的所有節點必須具有相同的副本集名稱, 否則客戶端不會將它們視為副本集的一部分
也可以到以下網址查看選項詳細說明
type RedisURI ¶
type RedisURI string
RedisURI redis連接字串, 選項字串是仿造mongo配置字串做出來的, 選項字串語法如下
- redisdb://[username:password@]host1:port1[,host2:port2,...,hostN:portN]/[?options]
語法中各組件的說明如下
- redisdb:// @必選 必須是 'redisdb://'
- [username:password@] @必選 指定連接時使用的帳號密碼
- host1:port1[,host2:port2,...,hostN:portN]/ @必選 指定連接位址與埠號, 如果要連接到叢集或是哨兵的話, 就需要設定多組位址與埠號
- [?options] @必選 設定連接選項, 選項以'&'符號分隔, 例如: name=value&name=value
以下是連接選項說明
- clientName 設置連接名稱
- dbid 設置連接資料庫編號
- maxRetries 最大重試次數, 預設值為3, -1表示關閉此功能
- minRetryBackoff 最小重試時間間隔, 預設值為8毫秒, -1表示關閉此功能
- maxRetryBackoff 最大重試時間間隔, 預設值為512毫秒, -1表示關閉此功能
- dialTimeout 連接超時時間, 預設值為5秒
- readTimeout socket讀取超時時間, 超時會導致命令失敗, 預設值為3秒, -1表示關閉此功能
- writeTimeout socket寫入超時時間, 超時會導致命令失敗, 預設值為3秒, -1表示關閉此功能
- contextTimeoutEnabled 控制客戶端是否遵守上下文超時和截止日期
- poolFIFO 設置連接池的類型, true表示FIFO池, false表示LIFO池 與LIFO相比, FIFO的開銷略高, 但它有助於更快地關閉空閒連接, 從而減少池大小
- poolSize 最大socket連接數, 預設值為CPU數量*10
- poolTimeout 連接池超時時間, 超時會導致從連接池中獲得連接失敗, 預設值為readTimeout + 1秒
- minIdleConns 連接池中最小的閒置連接數量, 請注意建立新連接是很慢的
- maxIdleConns 連接池中最大的閒置連接數量
- connMaxIdleTime 連接閒置時間, 連接如果閒置超過此時間將會被刪除, 應該小於服務器的超時時間, 預設值為5分鐘, -1表示關閉此功能
- connMaxLifetime 連接生存時間, 連接如果超過此時間將會被刪除, 預設值為不刪除
- maxRedirects @叢集專用 當重定向時的最大重試次數, 預設值為8次
- readOnly @叢集專用 控制是否在從屬節點上啟用只讀命令
- routeByLatency @叢集專用 控制是否允許將只讀命令路由到最近的主節點或從節點, 它會自動啟用readOnly
- routeRandomly @叢集專用 控制是否允許將只讀命令路由到隨機主節點或從節點, 它會自動啟用readOnly
- masterName @哨兵專用 設定連接redis的主節點名稱, 當設定此項後, 就會改用哨兵模式來連接到redis
也可以到以下網址查看選項詳細說明
type Redmomgr ¶
type Redmomgr struct {
// contains filtered or unexported fields
}
Redmomgr 資料庫管理器, 用於管理雙層式資料庫架構
- 主要資料庫: 用redis實作
- 次要資料庫: 用mongo實作
當要新增資料庫時, 需要遵循以下流程:
- 新增主要/次要資料庫
- 新增混合資料庫: 這時會去取得先前新增的主要/次要資料庫, 並且將其`綁定`到混合資料庫中; 要注意的是, 混合資料庫必定是一個主要資料庫加上一個次要資料庫的組合, 若是缺少了任何一方則會失敗
若要執行資料庫操作時, 呼叫 Get... 系列函式來取得資料庫物件
func (*Redmomgr) AddMinor ¶
func (this *Redmomgr) AddMinor(minorName string, uri MongoURI, dbName string) (minor *Minor, err error)
AddMinor 新增次要資料庫, 需要提供 MongoURI 來指定要連接的資料庫以及連接選項; 另外需要指定mongo資料庫名稱, 簡化後面取得執行器的流程, 但也因此限制次要資料庫不能在多個mongo資料庫間切換
type Save ¶
type Save struct {
// contains filtered or unexported fields
}
Save 儲存判斷資料, 用儲存旗標來判斷是否要儲存到主要/次要資料庫
type Set ¶
type Set[T any] struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Key string // 索引值 Data *T // 資料物件 // contains filtered or unexported fields }
Set 設值行為, 以索引字串與資料到主要/次要資料庫中儲存資料, 不會影響主要資料庫中的資料的逾期時間, 使用上有以下幾點須注意
- 需要事先建立好資料結構, 並填寫到泛型類型T中, 請不要填入指標類型
- 資料結構如果包含 Save 結構或是符合 Saver 介面, 會套用儲存判斷機制, 減少不必要的儲存操作
- 資料結構的成員都需要設定好`bson:xxxxx`屬性
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data 並且不能為nil
type SetEx ¶ added in v1.1.35
type SetEx[T any] struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Expire time.Duration // 逾期時間, 若為0表示不逾期, 若為-1或是 KeepTTL 則表示不更動逾期時間 Key string // 索引值 Data *T // 資料物件 // contains filtered or unexported fields }
SetEx 設值設定逾期時間行為, 以索引字串與資料到主要/次要資料庫中儲存資料, 主要資料庫中的資料將會有逾期時間, 使用上有以下幾點須注意
- 需要事先建立好資料結構, 並填寫到泛型類型T中, 請不要填入指標類型
- 資料結構如果包含 Save 結構或是符合 Saver 介面, 會套用儲存判斷機制, 減少不必要的儲存操作
- 資料結構的成員都需要設定好`bson:xxxxx`屬性
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Expire, 若不設置或是設置為0表示不逾期, 如果設為-1或是 KeepTTL 則表示不更動逾期時間
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data 並且不能為nil
type SetNX ¶
type SetNX[T any] struct { Behave // 行為物件 MajorEnable bool // 啟用主要資料庫 MinorEnable bool // 啟用次要資料庫 Meta Metaer // 元資料 Expire time.Duration // 逾期時間, 若為0表示不逾期, 若為-1或是 KeepTTL 則表示不更動逾期時間 Key string // 索引值 Data *T // 資料物件 // contains filtered or unexported fields }
SetNX 設值行為, 當索引不存在才執行, 以索引字串與資料到主要/次要資料庫中儲存資料, 使用上有以下幾點須注意
- 需要事先建立好資料結構, 並填寫到泛型類型T中, 請不要填入指標類型
- 資料結構如果包含 Save 結構或是符合 Saver 介面, 會套用儲存判斷機制, 減少不必要的儲存操作
- 資料結構的成員都需要設定好`bson:xxxxx`屬性
- 執行前設定好 MajorEnable, MinorEnable
- 執行前設定好 Meta, 這需要事先建立好與 Metaer 介面符合的元資料結構
- 執行前設定好 Expire, 若不設置或是設置為0表示不逾期, 如果設為-1或是 KeepTTL 則表示不更動逾期時間
- 執行前設定好 Key 並且不能為空字串
- 執行前設定好 Data 並且不能為nil
type Submit ¶
type Submit struct {
// contains filtered or unexported fields
}
Submit 混合資料庫執行器, 執行命令時需要遵循以下流程
- 定義包含了 Behave 的行為結構 / 定義繼承了 Behavior 的行為結構
- 建立行為資料, 並且填寫內容(例如索引值, 資料內容, 結果成員等)
- 取得執行物件
- 新增行為到執行物件中
- 執行命令 Exec
- 檢查執行命令結果以及進行後續處理
目前已經實作了幾個預設行為 Lock, Unlock, Get, Set, Index 可以幫助使用者作行為設計; 其中 Lock, Unlock 已經直接整合到 Submit 提供的函式
func (*Submit) Exec ¶
Exec 執行命令, 執行命令時, 會以下列順序執行
- 執行所有行為的 Prepare 函式, 如果有錯誤就中止執行
- 執行主要資料庫的管線處理
- 執行所有行為的 Complete 函式, 如果有錯誤就中止執行
- 執行次要資料庫的管線處理
- 清除管線資料