如果用go写一个类似redis的键值对内存存储器,性能最佳的做法是什么?
一个自然而然的想法是用map,但是,go的map是线程(协程)不安全的,即使用sync.Map,性能也不太好。难道用concurrentMap?
还是应该像redis一样,存取用单线程,然后取存请求排队等候?如果使用redis的单线程模型,可以用chan,让其他协程阻塞等待,然后用map存储。
如果用go写一个类似redis的键值对内存存储器,性能最佳的做法是什么?
一个自然而然的想法是用map,但是,go的map是线程(协程)不安全的,即使用sync.Map,性能也不太好。难道用concurrentMap?
还是应该像redis一样,存取用单线程,然后取存请求排队等候?如果使用redis的单线程模型,可以用chan,让其他协程阻塞等待,然后用map存储。
2 回答1.3k 阅读
2 回答1.1k 阅读
2 回答1.1k 阅读
2 回答885 阅读
3 回答702 阅读
2 回答873 阅读
1 回答866 阅读
不知道从哪里得出的结论,说 sync.Map 的性能不好。我能找得到的信息源不多,如果有请补充提供。其实从性能和实现的角度上说,Redis 的队列形式其实也不是最优化的(当然内存的读写速度已经足够的高)。
sync.Map 的采用的策略其实就是读写分离,你看内部的实现其实是有两个 map ,具体可以参见 https://sreramk.medium.com/go... 。
同时,不知道题主有哪些极端的场景需要考虑内存方面的性能,还有我个人比较迷惑的是 concurrent map 是否是标准库中的,因为我只找到 Github 以及 Golang Example 中的些信息(抱歉,真的没有使用过) https://golangexample.com/a-t...