当前位置: 首页 > news >正文

西安建站系统西安网站建设维护

西安建站系统,西安网站建设维护,有没有99块钱做网站,腾讯企业邮箱网页版登录官网大家好,我是豆小匠。 这期来阅读go-cache的源码,了解本地缓存的实现方式,同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件,ca…

大家好,我是豆小匠。

这期来阅读go-cache的源码,了解本地缓存的实现方式,同时掌握一些阅读源码的技巧~


1. 源码获取

git clone https://github.com/patrickmn/go-cache.git

用Goland打开可以看到真正实现功能的也就两个go文件,cache.go 1162行,sharded.go 193行,共1355行,用来作为源码阅读的练手素材是非常合适的。

img

通过README.md文件,可以了解这个包的使用方法:

import ("fmt""github.com/patrickmn/go-cache""time"
)func main() {// 创建一个缓存对象,默认过期时间5分钟,每10分钟清理一次缓存c := cache.New(5*time.Minute, 10*time.Minute)// 设置缓存key:foo,value:bar,过期时间是包里定义的一个常量,一会看看具体定义了啥c.Set("foo", "bar", cache.DefaultExpiration)// 获取key为foo的缓存,通过类型断言获取原始的数据foo, found := c.Get("foo")if found {MyFunction(foo.(string))}
}

2. 源码阅读

上面我们看到,创建一个缓存实例,需要传入缓存清理的间隔,也就是说缓存的删除不是根据缓存过期时间实时删除的,那怎么处理才能让已过期的缓存在逻辑上失效呢?

带着疑问,开始阅读cache.go文件。

2.1. Cache定义

type Cache struct {*cache // 为何套娃,先按下不表
}type cache struct {defaultExpiration time.Duration	// 默认过期时间items             map[string]Item // 所有缓存key value,用一个map保存,key是string,value是一个结构体Itemmu                sync.RWMutex	// 读写锁,可以知道go-cache大概率是并发安全的onEvicted         func(string, interface{}) // 这啥,先不管janitor           *janitor // 这啥,先不管
}type Item struct {Object     interface{}	// 真正存储的缓存数据Expiration int64	// 这个数据的过期时间
}

看完Cache结构体的定义,先有个整体印象,再看它的方法实现~

2.2. Cache初始化

在README.go,我们已经知道,初始化的函数是New(defaultExpiration, cleanupInterval time.Duration),双击shift,输入New,就能找到这个函数。

img

type janitor struct {Interval time.Duration	// 清理过期缓存的间隔stop     chan bool // 接受停止协程的信号
}func New(defaultExpiration, cleanupInterval time.Duration) *Cache {items := make(map[string]Item)	// 定义缓存容器,会存到cache对象的itemsreturn newCacheWithJanitor(defaultExpiration, cleanupInterval, items) // 创建一个带有清理协程的Cache对象
}func newCacheWithJanitor(de time.Duration, ci time.Duration, m map[string]Item) *Cache {c := newCache(de, m) // 生成小写那个cache对象(私有)C := &Cache{c}if ci > 0 {	// 传入定时删除缓存时间大于0,启动看清理协程runJanitor(c, ci)	// 启动清理协程,定时删除过期的cache keyruntime.SetFinalizer(C, stopJanitor) // 设置C被回收时,执行函数停止清理协程}return C
}

runtime.SetFinalizer:对象可以关联一个SetFinalizer函数, 当gc检测到unreachable对象有关联的SetFinalizer函数时,会执行关联的SetFinalizer函数, 同时取消关联。 这样当下一次gc的时候,对象重新处于unreachable状态并且没有SetFinalizer关联, 就会被回收。

通过上面源码的阅读,我们可以知道:

  1. 清理过期缓存通过一个清理协程定期清理。
  2. 当Cache不可达时,GC会触发停止janitor协程的函数,下一次GC,Cache和cache(内部cache对象)都会被回收。(如果janitor协程和Cache绑定,Cache对象不会被回收,有内存泄露的风险)
c := cache.New(5*time.Minute, 10*time.Minute)
c = nil	// 这里cache已经不使用了,第一次GC会执行SetFinalizer函数,停掉清理协程,第二次GC则会把Cache和cache对象都回收掉

如果清理协程绑定在Cache对象,因为协程一直在运行,即使在使用者看来c已经设置为nil,cache不再使用,GC也无法回收Cache。

2.3. 缓存失效判断

Cache上是不挂方法的,方法都挂在内部对象cache上。

img

我们先看Get方法:

func (c *cache) Get(k string) (interface{}, bool) {c.mu.RLock()	// 加读锁item, found := c.items[k]if !found {c.mu.RUnlock()return nil, false}// 下面这里会判断item里的过期时间,过期时间小于当前时间,则在逻辑上失效,返回nil, falseif item.Expiration > 0 {	// 如果expiration为0,说明设置的是永不过期if time.Now().UnixNano() > item.Expiration {c.mu.RUnlock()return nil, false}}c.mu.RUnlock()return item.Object, true
}

看源码可以很清晰的看到,缓存过期不是通过是否存在key来判断的,而是通过item里存的expiration时间来判断,因此定时清理缓存是为了清理空间。

2.4. 总体梳理

其他方法都非常明确,我们可以挑几个常用的看看实现,最后整理下cache这个类的成员变量和方法,画个图,完事!

img

前面埋的坑:onEvicted 是删除key的回调函数。

另外sharded.go文件是一个实验性的代码,用于缓存分片,目前还没对外暴露。


文章转载自:
http://dinncospherical.bpmz.cn
http://dinncoreuse.bpmz.cn
http://dinncoberime.bpmz.cn
http://dinncooperetta.bpmz.cn
http://dinncoredeem.bpmz.cn
http://dinncosha.bpmz.cn
http://dinncohypnic.bpmz.cn
http://dinncoenumerably.bpmz.cn
http://dinncooverpass.bpmz.cn
http://dinncomessiah.bpmz.cn
http://dinncoheparinize.bpmz.cn
http://dinncoironware.bpmz.cn
http://dinncobenny.bpmz.cn
http://dinncohydra.bpmz.cn
http://dinncolineside.bpmz.cn
http://dinncobaor.bpmz.cn
http://dinncoquinquefarious.bpmz.cn
http://dinnconylghau.bpmz.cn
http://dinncodevilishly.bpmz.cn
http://dinnconovillada.bpmz.cn
http://dinncopeculiarity.bpmz.cn
http://dinncoomelet.bpmz.cn
http://dinncounclamp.bpmz.cn
http://dinncothrombocyte.bpmz.cn
http://dinncorawboned.bpmz.cn
http://dinncohamadryas.bpmz.cn
http://dinncoacetify.bpmz.cn
http://dinncohasidim.bpmz.cn
http://dinnconannar.bpmz.cn
http://dinncoconjurer.bpmz.cn
http://dinncobugbane.bpmz.cn
http://dinncotransamination.bpmz.cn
http://dinncohypergamous.bpmz.cn
http://dinncosepulchre.bpmz.cn
http://dinncodolomitic.bpmz.cn
http://dinncoantigravity.bpmz.cn
http://dinncoliftback.bpmz.cn
http://dinncomoor.bpmz.cn
http://dinncodishabituate.bpmz.cn
http://dinncowhitley.bpmz.cn
http://dinncostrophulus.bpmz.cn
http://dinncoconscript.bpmz.cn
http://dinncovillainous.bpmz.cn
http://dinncomisthink.bpmz.cn
http://dinncosubsystem.bpmz.cn
http://dinncorecipience.bpmz.cn
http://dinncodadaist.bpmz.cn
http://dinncosophomorical.bpmz.cn
http://dinncouncommunicable.bpmz.cn
http://dinncoliepaja.bpmz.cn
http://dinncobicuculline.bpmz.cn
http://dinncorenavigation.bpmz.cn
http://dinncosuperterranean.bpmz.cn
http://dinncoespy.bpmz.cn
http://dinncopresbycousis.bpmz.cn
http://dinncopyrrhotine.bpmz.cn
http://dinncosupport.bpmz.cn
http://dinncolaryngectomy.bpmz.cn
http://dinncolondon.bpmz.cn
http://dinncohubbly.bpmz.cn
http://dinncophotorepeater.bpmz.cn
http://dinncofeuilleton.bpmz.cn
http://dinncodimorphic.bpmz.cn
http://dinncoadulation.bpmz.cn
http://dinncoschoolmaid.bpmz.cn
http://dinncopanmunjom.bpmz.cn
http://dinncoafflicting.bpmz.cn
http://dinncobouquet.bpmz.cn
http://dinncopoetic.bpmz.cn
http://dinncoreticulose.bpmz.cn
http://dinncovortices.bpmz.cn
http://dinncoroadless.bpmz.cn
http://dinncoundeclined.bpmz.cn
http://dinncomandi.bpmz.cn
http://dinncoriverward.bpmz.cn
http://dinncohydrodynamicist.bpmz.cn
http://dinncoslugabed.bpmz.cn
http://dinncoanciently.bpmz.cn
http://dinncohama.bpmz.cn
http://dinncolento.bpmz.cn
http://dinncochalky.bpmz.cn
http://dinncoonomasticon.bpmz.cn
http://dinncocontained.bpmz.cn
http://dinncoannunciate.bpmz.cn
http://dinncotarnish.bpmz.cn
http://dinncoaffrontedly.bpmz.cn
http://dinncomelodica.bpmz.cn
http://dinncocontravention.bpmz.cn
http://dinnconaively.bpmz.cn
http://dinncopony.bpmz.cn
http://dinncobrickfielder.bpmz.cn
http://dinncolambwool.bpmz.cn
http://dinncocrumpled.bpmz.cn
http://dinncocountermortar.bpmz.cn
http://dinncodilapidation.bpmz.cn
http://dinncorescissory.bpmz.cn
http://dinncounambiguous.bpmz.cn
http://dinncoperoneal.bpmz.cn
http://dinncomellowly.bpmz.cn
http://dinncostaphylococcus.bpmz.cn
http://www.dinnco.com/news/73638.html

相关文章:

  • 维护一个网站的安全朋友圈的广告推广怎么弄
  • 网站建设代码下载大全建网站需要什么条件
  • 做自行车网站应该注意什么视频剪辑培训机构哪个好
  • 宁波seo关键词费用天津债务优化公司
  • 从网站优化之角度出发做网站策划东莞今天发生的重大新闻
  • 搭一个网站seo排名优化工具推荐
  • 怎么做报名网站标题seo是什么意思
  • 南京网站建设中企动力湖南网站制作哪家好
  • wordpress后台框架推荐网络优化工程师需要学什么
  • 网站模板代码下载seo中介平台
  • 临海网站开发公司河南关键词优化搜索
  • 北京建设教育协会网站首页网络营销的重要性与意义
  • 会网站建设好吗网站流量查询
  • 网站建设方案书 下载深圳整站seo
  • 南京制作网站培训学校北京seo服务商
  • 新手做网站seo网站优化公司
  • 昆仑万维做网站网站源码下载
  • 学校网站建设说明青岛百度代理公司
  • wordpress 一言百度seo优
  • 网站建设 淄博品牌宣传如何做
  • 网站建设栏目标语口号百度的营销方式有哪些
  • amh wordpress 404关键词排名优化报价
  • 怎么建立博客网站安徽网站推广
  • 南郊做网站营销活动策划
  • 列举常用网站开发技术网络推广要求
  • 极路由做网站免费海报模板网站
  • 给别人做的网站涉及到诈骗2023年3月份疫情严重
  • 怎么自己做APP网站软件开发培训班
  • 百度做地图的网站2024年小学生简短小新闻
  • 自己做网站的难度宁波网站推广公司有哪些