go 写键值对存储正确做法是什么?

如果用go写一个类似redis的键值对内存存储器,性能最佳的做法是什么?
一个自然而然的想法是用map,但是,go的map是线程(协程)不安全的,即使用sync.Map,性能也不太好。难道用concurrentMap?
还是应该像redis一样,存取用单线程,然后取存请求排队等候?如果使用redis的单线程模型,可以用chan,让其他协程阻塞等待,然后用map存储。

阅读 2.3k
2 个回答
即使用 sync.Map,性能也不太好

不知道从哪里得出的结论,说 sync.Map 的性能不好。我能找得到的信息源不多,如果有请补充提供。其实从性能和实现的角度上说,Redis 的队列形式其实也不是最优化的(当然内存的读写速度已经足够的高)。

sync.Map 的采用的策略其实就是读写分离,你看内部的实现其实是有两个 map ,具体可以参见 https://sreramk.medium.com/go...

同时,不知道题主有哪些极端的场景需要考虑内存方面的性能,还有我个人比较迷惑的是 concurrent map 是否是标准库中的,因为我只找到 Github 以及 Golang Example 中的些信息(抱歉,真的没有使用过) https://golangexample.com/a-t...

新手上路,请多包涵

参考bigCache, 用slice做索引

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题