golang使用groupcache(github.com上golang团队发布)
发布时间:2020-12-16 18:23:49 所属栏目:大数据 来源:网络整理
导读:groupcache 简介 在软件系统中使用缓存,可以降低系统响应时间,提高用户体验,降低某些系统模块的压力. groupcache是一款开源的缓存组件.与memcache与redis不同的时,groupcache不需要单独的部署,可以作为你程序的一个库来使用. 这样方便我们开发的程序部署. gr
groupcache 简介在软件系统中使用缓存,可以降低系统响应时间,提高用户体验,降低某些系统模块的压力. groupcache使用流程介绍
// 创建一个Group实例,
// 第一个参数是group名字.
// 第二个参数是缓冲区大小.
// 第三个参数是回调函数.
func NewGroup(name string,cacheBytes int64,getter Getter) *Group {
return newGroup(name,cacheBytes,getter,nil)
}
// If peers is nil,the peerPicker is called via a sync.Once to initialize it.
func newGroup(name string,getter Getter,peers PeerPicker) *Group {
if getter == nil {
panic("nil Getter")
}
mu.Lock()
defer mu.Unlock()
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)
}
groups[name] = g
return g
}
func (g *Group) Get(ctx Context,key string,dest Sink) error {
// 如果注册了peer,则下边的函数生效,否则无效.
g.peersOnce.Do(g.initPeers)
// Stats的Gets 自增1
// 统计分析使用
g.Stats.Gets.Add(1)
// dest不能为空,否则报错.
if dest == nil {
return errors.New("groupcache: nil dest Sink")
}
// 根据key值在cache中查找缓存的值.
value,cacheHit := g.lookupCache(key)
if cacheHit {
g.Stats.CacheHits.Add(1)
return setSinkView(dest,value)
}
// Optimization to avoid double unmarshalling or copying: keep
// track of whether the dest was already populated. One caller
// (if local) will set this; the losers will not. The common
// case will likely be one caller.
destPopulated := false
value,destPopulated,err := g.load(ctx,key,dest)
if err != nil {
return err
}
if destPopulated {
return nil
}
return setSinkView(dest,value)
}
func (g *Group) getLocally(ctx Context,dest Sink) (ByteView,error) {
err := g.getter.Get(ctx,dest)
if err != nil {
return ByteView{},err
}
return dest.view()
}
type Sink interface {
// SetString sets the value to s.
SetString(s string) error
// SetBytes sets the value to the contents of v.
// The caller retains ownership of v.
SetBytes(v []byte) error
// SetProto sets the value to the encoded version of m.
// The caller retains ownership of m.
SetProto(m proto.Message) error
// view returns a frozen view of the bytes for caching.
view() (ByteView,error)
}
实现了Sink接口的类如下:
总结
go get github.com/golang/groupcache 温馨提示以上内容,纯属个人愚见,有高人看出漏洞,请指点,以免瑕疵文章,误人子弟,感激不尽.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |