dqfkd82886 2017-12-31 00:26
浏览 87

并发大量读取工作负载的数据结构

I am looking for a data-structure that stores 32bytes strings and allows fast lookups with preferred O(1) or O(log N) lookup complexity (the goal is only to determine if the key exists). Removal and insertion complexity is not critical, since those operations will be infrequent.

Not that it is relevant to the question, but i am working in Go. I could use a hashmap backed by a mutex, but contention would be a problem, and I prefer to avoid sharding if there is a better solution.

Thanks

  • 写回答

1条回答

  • dsfds4551 2017-12-31 08:18
    关注

    map is safe for concurrent read. You could put your desired map inside a sync/atomic.Value and when you want to write to it, duplicate the map and change it, then put it back inside Value. From docs:

    The following example shows how to maintain a scalable frequently read, but infrequently updated data structure using copy-on-write idiom.

    Code:

    type Map map[string]string
    var m Value
    m.Store(make(Map))
    var mu sync.Mutex // used only by writers
    // read function can be used to read the data without further synchronization
    read := func(key string) (val string) {
            m1 := m.Load().(Map)
            return m1[key]
    }
    // insert function can be used to update the data without further synchronization
    insert := func(key, val string) {
            mu.Lock() // synchronize with other potential writers
            defer mu.Unlock()
            m1 := m.Load().(Map) // load current value of the data structure
            m2 := make(Map)      // create a new value
            for k, v := range m1 {
                    m2[k] = v // copy all data from the current object to the new one
            }
            m2[key] = val // do the update that we need
            m.Store(m2)   // atomically replace the current object with the new one
            // At this point all new readers start working with the new version.
            // The old version will be garbage collected once the existing readers
            // (if any) are done with it.
    }
    _, _ = read, insert
    

    You could also use a pointer to you map instead of Value and store it atomically using StorePointer/LoadPointer but that's not cleaner cause you should use an unsafe pointer and cast it.

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用