groupcache源码(2) Group

Group对象

  • Group对象结构以及方法
type Group struct {
    name       string
    getter     Getter
    peersOnce  sync.Once
    peers      PeerPicker
    cacheBytes int64 // limit for sum of mainCache and hotCache size

    mainCache cache
    hotCache cache

    loadGroup flightGroup
}

func (g *Group) initPeers()
func (g *Group) Get()
func (g *Group) load()
func (g *Group) getLocally()
func (g *Group) getFromPeer()
func (g *Group) lookupCache()
func (g *Group) populateCache()

NewGroup()

  • 根据程序执行顺序,NewHTTPPool()->NewGroup()
func NewGroup(name string, cacheBytes int64, getter Getter) *Group {
    return newGroup(name, cacheBytes, getter, nil)
}

// 调用过程
func main() {
    // groupcache.GetterFunc是一个实现了Getter.Get接口的函数类型,用于转换自定义函数的类型
    // 这样才能符合NewGroup()的Getter类型传入参数要求
    image_cache := groupcache.NewGroup("testGroup", 8<<30, groupcache.GetterFunc(
        func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
            rows, _ := db.Query("SELECT key, value FROM tbl_cache_map where key = ?", key)
            for rows.Next() {
                p := new(TblCache)
                err := rows.Scan(&p.Key, &p.Value)
                if err != nil {
                    fmt.Println(err)
                }
                fmt.Printf("get %s of value from tbl_cache_map\n", key)
                return dest.SetString("tbl_cache_map.value : " + p.Value)
            }
            return nil
        }))
}
  • 需要缓存数据方式需要用户自定义
  • 因此groupcache.GetterFunc用于给自定义函数转换类型

newGroup()

func newGroup(name string, cacheBytes int64, getter Getter, peers PeerPicker) *Group {
    if getter == nil {
        panic("nil Getter")
    }
    mu.Lock()
    defer mu.Unlock()

    // initPeerServerOnce Group唯一标识
    initPeerServerOnce.Do(callInitPeerServer)
    if _, dup := groups[name]; dup {
        panic("duplicate registration of group " + name)
    }
    g := &Group{
        name:       name,
        getter:     getter,
        peers:      peers,
        cacheBytes: cacheBytes,
        loadGroup:  &singleflight.Group{},
    }
    if fn := newGroupHook; fn != nil {
        fn(g)
    }
    
    // 添加GroupMap
    groups[name] = g
    return g
}
  • 初始化Group对象以及添加GroupMap
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,163评论 0 21
  • 你是流落夜里的光 沿着花山的脊梁 瘦小的翅膀明灭不定地飞翔 此刻我站在院子里 和我的爱人有关 此刻山川不再悠远 我...
    北京的雁北阅读 400评论 0 4
  • 最怕看见的是,一副好牌被打烂。 最怕出现的是,自认为是什么都不想做,事实却是什么都不会做。 逃避一切的结果会是失去...
    joannaooo阅读 144评论 0 0
  • 8月10日 周五 宜春晴 铜鼓大雨 亲爱的宝贝,今天的你听觉系统已经发育完全了,能够听到妈妈的心跳声、...
    每天有惊喜阅读 186评论 0 1