beego cache模組原始碼分析筆記四
beego cache模組下的ssdb原始碼,這段原始碼是在gossdb包的基礎上進行封裝。
整個原始碼在230行左右,內容主要有Cache介面卡,建立這個介面卡的函式,以及介面卡的方法內容。
1、type Cache struct
type Cache struct {
conn *ssdb.Client
conninfo []string
}
2、func NewSsdbCache() cache.Cache
func NewSsdbCache() cache.Cache {
return &Cache{}
}
3、
1)func (rc *Cache) Get(key string) interface{}
根據鍵獲取值
func (rc *Cache) Get(key string) interface{} {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return nil
}
}
value, err := rc.conn.Get(key)
if err == nil {
return value
}
return nil
}
2)func (rc *Cache) GetMulti(keys []string) []interface{}
用多個鍵獲取多個值
func (rc *Cache) GetMulti(keys []string) []interface{} {
size := len(keys)
var values []interface{}
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
for i := 0; i < size; i++ {
values = append(values, err)
}
return values
}
}
res, err := rc.conn.Do("multi_get", keys)
resSize := len(res)
if err == nil {
for i := 1; i < resSize; i += 2 {
values = append(values, res[i+1])
}
return values
}
for i := 0; i < size; i++ {
values = append(values, err)
}
return values
}
3)func (rc *Cache) DelMulti(keys []string) error
傳入多個鍵,進行相應的刪除
func (rc *Cache) DelMulti(keys []string) error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
_, err := rc.conn.Do("multi_del", keys)
return err
}
4)func (rc *Cache) Put(key string, value interface{}, timeout time.Duration) error
根據鍵值進行儲存
func (rc *Cache) Put(key string, value interface{}, timeout time.Duration) error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
v, ok := value.(string)
if !ok {
return errors.New("value must string")
}
var resp []string
var err error
ttl := int(timeout / time.Second)
if ttl < 0 {
resp, err = rc.conn.Do("set", key, v)
} else {
resp, err = rc.conn.Do("setx", key, v, ttl)
}
if err != nil {
return err
}
if len(resp) == 2 && resp[0] == "ok" {
return nil
}
return errors.New("bad response")
}
5)func (rc *Cache) Delete(key string) error
刪除一個鍵值對
func (rc *Cache) Delete(key string) error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
_, err := rc.conn.Del(key)
return err
}
6)func (rc *Cache) Incr(key string) error
傳入鍵,讓值自加一
func (rc *Cache) Incr(key string) error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
_, err := rc.conn.Do("incr", key, 1)
return err
}
7)func (rc *Cache) Decr(key string) error
傳入鍵,讓值自減一
func (rc *Cache) Decr(key string) error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
_, err := rc.conn.Do("incr", key, -1)
return err
}
8)func (rc *Cache) IsExist(key string) bool
判斷鍵是否存在
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return false
}
}
resp, err := rc.conn.Do("exists", key)
if err != nil {
return false
}
if len(resp) == 2 && resp[1] == "1" {
return true
}
return false
}
9)func (rc *Cache) ClearAll() error
清除cache中快取的所有快取
func (rc *Cache) ClearAll() error {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
keyStart, keyEnd, limit := "", "", 50
resp, err := rc.Scan(keyStart, keyEnd, limit)
for err == nil {
size := len(resp)
if size == 1 {
return nil
}
keys := []string{}
for i := 1; i < size; i += 2 {
keys = append(keys, resp[i])
}
_, e := rc.conn.Do("multi_del", keys)
if e != nil {
return e
}
keyStart = resp[size-2]
resp, err = rc.Scan(keyStart, keyEnd, limit)
}
return err
}
10)func (rc *Cache) Scan(keyStart string, keyEnd string, limit int) ([]string, error)
func (rc *Cache) Scan(keyStart string, keyEnd string, limit int) ([]string, error) {
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return nil, err
}
}
resp, err := rc.conn.Do("scan", keyStart, keyEnd, limit)
if err != nil {
return nil, err
}
return resp, nil
}
11)func (rc *Cache) StartAndGC(config string) error
func (rc *Cache) StartAndGC(config string) error {
var cf map[string]string
json.Unmarshal([]byte(config), &cf)
if _, ok := cf["conn"]; !ok {
return errors.New("config has no conn key")
}
rc.conninfo = strings.Split(cf["conn"], ";")
if rc.conn == nil {
if err := rc.connectInit(); err != nil {
return err
}
}
return nil
}
func (rc *Cache) connectInit() error {
conninfoArray := strings.Split(rc.conninfo[0], ":")
host := conninfoArray[0]
port, e := strconv.Atoi(conninfoArray[1])
if e != nil {
return e
}
var err error
rc.conn, err = ssdb.Connect(host, port)
return err
}
func init() {
cache.Register("ssdb", NewSsdbCache)
}
相關文章
- mybaits原始碼分析--日誌模組(四)AI原始碼
- Spring cache原始碼分析Spring原始碼
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- Guava 原始碼分析(Cache 原理)Guava原始碼
- FutureTask原始碼分析筆記原始碼筆記
- 原始碼分析筆記——OkHttp原始碼筆記HTTP
- mybaits原始碼分析--binding模組(五)AI原始碼
- 從原始碼分析Node的Cluster模組原始碼
- Swoole 原始碼分析——Reactor 模組之 ReactorEpoll原始碼React
- Swoole 原始碼分析——Client模組之Send原始碼client
- Swoole 原始碼分析——Client模組之Connect原始碼client
- Swoole 原始碼分析——Client模組之Recv原始碼client
- JavaScript 模組化及 SeaJs 原始碼分析JavaScriptJS原始碼
- mybaits原始碼分析--快取模組(六)AI原始碼快取
- Django(49)drf解析模組原始碼分析Django原始碼
- Django(51)drf渲染模組原始碼分析Django原始碼
- TiFlash 原始碼閱讀(四)TiFlash DDL 模組設計及實現分析原始碼
- cache2go – cachetable原始碼分析Go原始碼
- Swoole 原始碼分析——Server 模組之 OpenSSL (下)原始碼Server
- Swoole 原始碼分析——Server 模組之 OpenSSL (上)原始碼Server
- (一) Mybatis原始碼分析-解析器模組MyBatis原始碼
- Swoole 原始碼分析——Server模組之OpenSSL (上)原始碼Server
- Django(48)drf請求模組原始碼分析Django原始碼
- btcpool礦池原始碼分析(3)-BlockMaker模組解析TCP原始碼BloC
- btcpool礦池原始碼分析(4)-GbtMaker模組解析TCP原始碼
- btcpool礦池原始碼分析(5)-JobMaker模組解析TCP原始碼
- btcpool礦池原始碼分析(6)-nmcauxmaker模組解析TCP原始碼UX
- btcpool礦池原始碼分析(6)-PoolWatcher模組解析TCP原始碼
- btcpool礦池原始碼分析(7)-sharelogger模組解析TCP原始碼
- btcpool礦池原始碼分析(9)-statshttpd模組解析TCP原始碼httpd
- btcpool礦池原始碼分析(10)-StratumServer模組解析TCP原始碼Server
- Swoole 原始碼分析——鎖與訊號量模組原始碼
- Swoole 原始碼分析——基礎模組之 Pipe 管道原始碼
- mybaits原始碼分析--型別轉換模組(三)AI原始碼型別
- beego框架程式碼分析Go框架
- Guava 原始碼分析(Cache 原理【二階段】)Guava原始碼
- JDK1.8原始碼分析筆記-HashMapJDK原始碼筆記HashMap
- preact原始碼分析(四)React原始碼