• Timo
    2019-05-30
    做个sync.Map优化点的小总结:
    1. 空间换时间。 通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响
    2. 使用只读数据(read),避免读写冲突。
    3. 动态调整,miss次数多了之后,将dirty数据提升为read
    4. 延迟删除。 删除一个键值只是打标记,只有在提升dirty的时候才清理删除的数据
    5. 优先从read读取、更新、删除,因为对read的读取不需要锁
    展开
    
     7
  • sky
    2018-11-01
    郝大 go方面能推荐下比较成熟的微服务框架吗

    作者回复: 在我发布的Github优秀Go语言项目的思维导图里有。

    
     6
  • Rainman
    2019-03-09
    这个脏字典让我想起了mysql的刷脏页。
    给老师点赞。
    
     3
  • 疯琴
    2020-01-05
    这个设计很巧妙,在自己的开发中可以借鉴这种思想。有个问题请问老师:
    “脏字典中的键值对集合总是完全的”,而“read 和 dirty 互换之后 dirty 会置空”,那么重建的意思是不是这样的:在下一次访问 read 的时候,将 read 中的键值对全部复制到 dirty 中?

    作者回复: read 和 dirty 互换是分两步走的。Load 的时候如果发现“不得不去 dirty 中查找”的情况已经有很多了,就会把 dirty 作为新的 read,然后把 dirty 置为 nil。之后,在 Store 的时候,如果发现健是新的,而且是对于新 read 的第一个新健(此时 dirty 必定为 nil),那么就重新初始化 dirty,然后把新 read 中的有效键一个一个地存入 dirty。

    另外你可以尝试阅读一下 sync.Map 的源码,写得还是挺清晰的。可以配合着这里的文章去看。

     1
     1
  • 虢國技醬
    2019-03-03
    打卡
    
     1
  • 墨水里的鱼
    2018-11-30
    如何初始化reflect.Type?reflect.TypeOf(1) reflect.TypeOf("a") 只能这样吗?
    
     1
  • 渺小de尘埃
    2018-11-01
    当一个结构体里的字段是sync.map类型的,怎么json序列化呢?

    作者回复: 既然要序列化了就用不着同步了吧,用个普通map倒腾一下呗。或者你再包装一下,自定义序列化过程。

    
     1
  • Calios
    2019-08-14
    个人以为是读过的这个专栏里最精彩的一篇~ 只读字典和脏字典的实现好精彩,忍不住再去细细读一下sync.Map的实现。
    
    
  • 唐大少在路上。。。
    2019-05-11
    班门弄斧,其实有个细节帮老师丰富一下:
    两个原生map的定义为 map[interface{}]*entry
    其中的entry为一个只包含一个unsafe.pointer的结构体
    这里之所以value设置为指针类型,个人感觉就是为了在dirtry重建的时候直接把read里面这个entry的地址copy到dirty里面,这样当read中对entry里面的pointer执行原子替换的时候,dirty里面的值也会跟随着改变。
    这样,当每次对read已有key进行更新的时候就不用单独去操作一次dirty了
    展开
    
    
我们在线,来聊聊吧