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)
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 之前已经分析了外面的那几个文件,现在分析下里面的这几个文件。 这个目录夹里有两个文件,一个是测试文件。里面有一个结...
    ljh123阅读 1,432评论 0 0
  • 从代码库中可以看到有两个文件,其中有一个是测试文件。整个代码包括注释一共两百多行代码。 整个代码提供给开发者的内容...
    ljh123阅读 4,021评论 0 0
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,758评论 0 38
  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 11,465评论 1 5
  • 比特币如火如荼,当然学习python也能帮助我们掌握比特币的行情,而且是自动的。如图,大大已经写好了获取数据的程序...
    TianAff阅读 3,258评论 1 3

友情链接更多精彩内容