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

天眼查询企业北京网站seo哪家公司好

天眼查询企业,北京网站seo哪家公司好,云匠网接单子容易吗,回收网站怎么做大家好#xff0c;我是豆小匠。 这期来阅读go-cache的源码#xff0c;了解本地缓存的实现方式#xff0c;同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件#xff0c;ca…大家好我是豆小匠。 这期来阅读go-cache的源码了解本地缓存的实现方式同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件cache.go 1162行sharded.go 193行共1355行用来作为源码阅读的练手素材是非常合适的。 通过README.md文件可以了解这个包的使用方法 import (fmtgithub.com/patrickmn/go-cachetime )func main() {// 创建一个缓存对象默认过期时间5分钟每10分钟清理一次缓存c : cache.New(5*time.Minute, 10*time.Minute)// 设置缓存keyfoovaluebar过期时间是包里定义的一个常量一会看看具体定义了啥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是stringvalue是一个结构体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就能找到这个函数。 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关联 就会被回收。 通过上面源码的阅读我们可以知道 清理过期缓存通过一个清理协程定期清理。当Cache不可达时GC会触发停止janitor协程的函数下一次GCCache和cache内部cache对象都会被回收。如果janitor协程和Cache绑定Cache对象不会被回收有内存泄露的风险 c : cache.New(5*time.Minute, 10*time.Minute) c nil // 这里cache已经不使用了第一次GC会执行SetFinalizer函数停掉清理协程第二次GC则会把Cache和cache对象都回收掉如果清理协程绑定在Cache对象因为协程一直在运行即使在使用者看来c已经设置为nilcache不再使用GC也无法回收Cache。 2.3. 缓存失效判断 Cache上是不挂方法的方法都挂在内部对象cache上。 我们先看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这个类的成员变量和方法画个图完事 前面埋的坑onEvicted 是删除key的回调函数。 另外sharded.go文件是一个实验性的代码用于缓存分片目前还没对外暴露。
http://wiki.neutronadmin.com/news/277449/

相关文章:

  • 西安网站建设畅网个人简历表格电子版下载
  • app网站开发多少钱中移建设 网站
  • 湘潭网站建设定制磐石网络网站的验证码是怎么做的
  • 喊别人做的网站不肯给代码岳阳网站项目建设报道
  • 网站免费推广物流网络图
  • 厦门建公司网站今天最新新闻报道
  • 做外贸卖小商品是哪个网站南宁网站设计平台
  • 网站运营与管理实训报告美观网站建设物美价廉
  • 公众号里的网站怎么做的网页视频提取
  • 免费的行情网站ifind是网页制作的基本知识
  • 宁波网站建设招商加盟网站颜色正确搭配实例
  • 河北建设网站公司软件开发都有哪些项目
  • 信邦建设工程有限公司网站专业零基础网站建设教学
  • 上海网站制作顾wordpress导航文件夹
  • 地方文明网站建设网站上传文件夹
  • 保护环境做网站素材那些网站可以做0首付分期手机
  • 做it的兼职网站有哪些权重2的网站
  • 无锡制作网站公司小程序源码分享
  • 没有网站可以做哪些互联网广告推广校园网页设计模板简单
  • 写着网站建设图片微信小程序短链接生成
  • 成都科技网站建设费用建立视觉健康档案的主要意义在于
  • 手表大全网站网站开发所需开发环境
  • 中山 家居 骏域网站建设专家中山网页设计
  • 哪个网站可以做行程攻略电子商务网站建设的体会
  • 广州一流高校建设网站建筑公司发展愿景
  • 互联网seo是什么意思镇江网站关键字优化如何
  • 手机网站触摸版app网站怎么制作
  • 免费的建设网站软件望野杜甫
  • 黄石做网站联系美食网页模板
  • 做展板好的网站山东外贸建站