美文网首页Gopher
beego cache模块源码分析笔记四

beego cache模块源码分析笔记四

作者: ljh123 | 来源:发表于2018-12-26 15:44 被阅读3次

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)
}

相关文章

  • beego cache模块源码分析笔记四

    beego cache模块下的ssdb源码,这段源码是在gossdb包的基础上进行封装。 整个源码在230行左右,...

  • beego cache模块源码分析笔记一

    cache模块是beego中的一个独立模块,这个模块的设计方式是经典的工厂模式。 cache.go:抽象接口部分、...

  • beego cache模块源码分析笔记三

    从代码库中可以看到有两个文件,其中有一个是测试文件。整个代码包括注释一共两百多行代码。 整个代码提供给开发者的内容...

  • beego cache模块源码分析笔记二

    之前已经分析了外面的那几个文件,现在分析下里面的这几个文件。 这个目录夹里有两个文件,一个是测试文件。里面有一个结...

  • go gomemcache包源码分析

    因为beego中的cache模块中的子模块memcached引用了这个包,所以也对这包的源码进行分析了下。花了一定...

  • beego config模块源码分析笔记四

    json.go源码,这个文件在260行左右,beego的每个文件耦合性非常小,所以分析源码是比较轻松的。这个文件和...

  • beego cache模块源码解析

    缘起.什么是cache? cache的中文名叫缓存,缓存在计算机的世界里无处不在,比如cpu的多级缓存,比如类似e...

  • beego源码cache

    一、缓存 cache模块是一个go缓存管理器,目前能够支持多种缓存方式: Memory、File、Redis、Me...

  • beego config模块源码分析笔记二

    第二个文件,fake.go,这个文件130行代码左右,整个代码分析下来挺简单。这个包使用NewFakeConfig...

  • beego config模块源码分析笔记三

    ini.go源码文件分析 这个文件里的代码是实现了解析ini配置文件,为开发者提供了两个结构体。ini知识1)ty...

网友评论

    本文标题:beego cache模块源码分析笔记四

    本文链接:https://www.haomeiwen.com/subject/zrjhlqtx.html