Golang 的 Map 可不可以存大量的数据?比如说几个 GB 的数据

2023-06-22 09:31:52 +08:00
 dw2693734d

因为 map 是 O(1)的,我想用来当 key value 数据库,快速查询一些数据。

这样会不会有什么隐患问题?

7232 次点击
所在节点    Go 编程语言
70 条回复
Masoud2023
2023-06-25 09:35:21 +08:00
这个确实得具体场景具体分析,如果不是那种延迟敏感场景,我觉得交给 redis 应该也没什么,看具体的取舍了。
djoiwhud
2023-06-25 09:52:24 +08:00
@documentzhangx66

呵呵。你开心就好。我错没错,我心理有数。你错没错,你根本没认知。


游戏分类是你这样分的?还分 RTS-webgame ,真是笑话。别人说的依赖内存,你搞半天以为是游戏客户端依赖内存。学生指点江山就这坏处。还客户端上百毫秒延迟?

啥叫偏执狂,啥叫自以为是。

包括 ysc3839 在内,说的问题都是 server 端,全部用户的实时战斗数据,状态数据,放在内存中。因为每个客户端每秒钟都有几十个请求,需要高频查询、修改状态数据,需要同步全局数据给大量用户。服务器即使是用 redis ,例如查一个用户的数据网络 IO 哪怕仅仅 1ms ,也是成本很高的。

你看看你自己再谈什么?

一下就暴露了毫无工程经验的菜鸡本质。
morty0
2023-06-25 10:13:21 +08:00
map 不能缩容, 有内存泄露的风险
smirkcat
2023-06-25 10:37:59 +08:00
建议了解下内存映射 kv 数据库,瞬间解决你的问题
ysc3839
2023-06-25 10:46:31 +08:00
@documentzhangx66 我开发的根本不是游戏服务器,只是举个例子,你又急于否定了。
而且这个问题只需要加多个进程内 map 进行缓存就能解决,举这个例子就是为了反驳你说的“觉得语言内置 map 性能比 Redis 好”,因为性能真的比只用 redis 好,redis 和 map 不是互斥关系,是互补关系。
cheng6563
2023-06-25 11:02:10 +08:00
PS:redis 可以用 unix socket 连接。
twing37
2023-06-25 12:35:16 +08:00
demo 且只读.完全没问题. 不放心就 zero gc 的 gocache,Ristretto 这些~

我是支持层主 @djoiwhud 的那句:实时数据放 Redis 的非常非常少。某些情况下多余的 1ms io 的确很难容忍.
documentzhangx66
2023-06-25 12:44:31 +08:00
@djoiwhud

1.游戏怎么分类,有很多种角度。比如从游戏内容来说,完全可以参考 Steam 的分类。

但如果从网络设计上进行分类,RTS 与 Web Game 的确属于不同的类别,并且 Web Game 其实还可以继续细分。

你如果觉得,我这种分类方式不正确,你完全可以提出自己的分类看法。

但如果你只是想来否定我的分类方法,却不提出自己的分类方法,那我觉得你这种行为,只是为了杠而杠,这类人我见多了。

2.我不认同 ysc3839 的见解。而且,有没有一种可能,菜鸟与菜鸟,才会有认同感?

3.我在前面说了,游戏的确很依赖内存。但你看看现在其他行业,工控、人工智障、医疗、数据存储,哪个不依赖内存?现在就连渣渣办公,都希望多加内存条,来提高 Office 、IM 软件的运行速度。你以为只有你游戏行业依赖内存?

4.你说我看看我自己在谈什么?

我在给你上课。

你觉得我哪里说的有问题,你倒是指出来啊。

你又指不出来,你只会否定,你这行为,和那些玻璃心的菜鸡,有啥区别?
documentzhangx66
2023-06-25 13:00:31 +08:00
@ysc3839

1.你用了一个 [急于否定] 的词。但在我看来,这其实是很正常的技术交流而已。

所谓技术交流,就是你提出一个观点,我同意,就给你点赞;我不同意,我就提出反对,并且解释我为什么反对。

如果你觉得,这种行为,叫 [急于否定] ,那么请你仔细看看你对我的回复,是不是也是 [急于否定] ?

2.你在前面,提出了一个完全是外行的游戏网络设计,先不说让你去看看主流网络游戏是怎么设计的,就算是正常的计算机本科,但凡听课了,也不会做你说的那种让人血压拉满的设计吧?

正确的设计思路,应该是,根据游戏业务,同时考虑网络原理,来进行联合设计。

比如,当一个或多个数据包,达到触发一个业务函数的门槛时,Game Server 才会向 Cache Server 拉取数据处理请求。
但并不代表一定是一个数据包就要处理一次。有很多优化方法的。比如去重、比如合并、比如省略非关键帧,比如强行设置对外调用频率,等等。

而且客户端行为,并不是说服务端少处理一个包,或多了 1ms 的延迟,客户端就卡了。我在前面就说了,人家吃鸡、王者、甚至 SC2 ,有时候高达上百延迟,人家也有完善的处理方法。你不去学习,拍脑袋就觉得这样不好,那网络游戏还要不要搞?干脆以后全改成局域网游戏?

3.我觉得我得重申一下,我并不是反对依赖内存,或者反对依赖内存对象。而是一个正常的设计,不能全靠内存对象。你知道当年热血传奇,为什么一到攻城就卡成 PPT 嘛 ? 你不去学习整个游戏 Server 的网络设计发展史,自然不了解这些问题。
csfreshman
2023-07-01 09:25:11 +08:00
@daiv 差不多,多线程去读加载数据,这个时间无所谓,等加载完再去注册 consul vns 等对外提供服务。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/950798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX