楼主背景游戏服务器开发, 一直以来沿用的是老一套 DB + redis/memcache 的形式来做存储。虽然方案比较稳定了,但是在扩容和复杂度上一直感觉不是那么直观。 看到过有一些公司直接舍弃 DB 层,只用一个 redis 定时持久化做存储, 但感觉小规模的项目还行,数据量上去了对内存要求会不会过大呢? 也见过有人舍弃缓存层只用 Postgres 来存储,据说百万级并发请求性能只比 redis 慢 1 倍?
另外问一下 MongoDB 算不算是一个 DB/Cache 合一的解决方案呢?就是我项目里只用一个 MongoDB ,MySQL/Postgre/redis 之流通通不要
请大佬现身说法!!!
1 youngce 2022-08-07 14:34:21 +08:00 ![]() 建议先搞清楚缓存和数据库用途的区别。。。 |
2 b00tyhunt3r OP 期待真大佬干货回答!! |
3 xsen 2022-08-07 16:19:29 +08:00 若是针对扩容与复杂度的话,建议了解下分布式数据库,如国内的 TiDB 之类的 当然,你游戏场景的这不算太复杂;分布式数据库之所以提出来,是因为基于传统的 SQL 数据库,在数据量海量情况下,要做在线或离线数据分析所以额外的大数据分析之类方案结合进来,会导致异常复杂 |
4 b00tyhunt3r OP @xsen 感觉有点杀鸡牛刀了吧。。。确实如你所说,游戏场景并不复杂,但是对性能要求却极高,这也是大部分时候我需要把数据存在内存的原因, 但是内存数据落地后的处理就有不一致的风险, 所以我现在思考的是能否去掉缓存 /DB 其中一端,来消除不一致性的一个成因,并减少开发复杂度? 我听说 PostgreSQL 自带 Cache 功能,如果使用 DB 自带的 Cache 层,那还需要引入 Redis 等外部软件吗? |
5 mrsatangel 2022-08-07 17:24:14 +08:00 - DB 的 cache 对外保持 ACID 的语义,Redis 压根就不是事务型数据库; - DB 的 cache 是 page 维度的,Redis 作为 cache 的数据是 key 维度的; 去掉缓存:损失性能; 去掉 DB:损失 durability 。但是也不能不能解,比如前段时间太监了的 optane 这种; Redis 的扩展性问题:老东家见过很多九百多 GB 的 redis 实例;实在不行还可以按 key 分片啊。 |
![]() | 6 geekvcn 2022-08-07 17:39:58 +08:00 via iPhoe 对内存容量要求未来应该可以不用太焦虑了,钱够就趁着 Intel 傲腾停产前多存点货,或者等 CXL 生态成熟,内存容量以后都不是事。以后数据库应该会围绕 CXL 生态开发,以后内存会分为 CPU 封装的高速 HMB 内存,CPU 扩展的 DDR 内存,CXL 扩展大容量共享内存池 |
7 ryan961 2022-08-07 18:33:33 +08:00 aws 推出的 [memoryDB]( https://aws.amazon.com/cn/blogs/china/comparison-of-amazon-memorydb-and-amazon-elasticache/) 会不会成为未来的一种趋势 |
8 wctml 2022-08-07 18:50:20 +08:00 |
9 Lighfer 2022-08-07 21:20:32 +08:00 apache ignite ? |
![]() | 10 killpanda 2022-08-07 21:27:52 +08:00 couchabase |
![]() | 11 killpanda 2022-08-07 21:27:58 +08:00 couchbase |
12 roundgis 2022-08-07 21:32:12 +08:00 via Android 在都可以支持 1T ram 大部分的景也用了吧 |
![]() | 13 noparking188 2022-08-07 21:51:46 +08:00 之前看的 V 站一个老哥回帖说,他们公司 MySQL 内存给几十上百 TB ,缓存开到最大,基本上数据都在内存里了 楼主你的场景和痛点没详细描述,不大好给你建议 |
14 mxT52CRuqR6o5 2022-08-07 21:53:32 +08:00 via Android 游戏的局内信息一般都不持久化的吧,局外信息也没有多高的性能需求啊 |
![]() | 15 nicebird 2022-08-07 22:01:22 +08:00 tcaplusDB |
16 joesonw 2022-08-07 22:23:46 +08:00 via iPhone redis 有落盘的,可以按 key hash 做分布式,特别适合游戏场景,公司里有用到 2 个多 T 的。一般玩家的相关数据都是按玩家 id hash 。 |
![]() | 17 linoder 2022-08-07 22:56:45 +08:00 via Android tidb |
![]() | 18 fkdtz 2022-08-08 00:20:07 +08:00 本质上来说还是 AP 和 CP 的取舍问题,没有办法既要高性能高可用,又要很强的一致性,只能根据业务场景来搭配使用。 |
19 iwdmb 2022-08-08 00:52:09 +08:00 Cassandra |
![]() | 20 akira 2022-08-08 02:04:20 +08:00 你一个游戏能有多少人 多少数据哦。。只看数据规模的话,redis 肯定是完全足够了的 |
![]() | 21 documentzhangx66 2022-08-08 02:32:24 +08:00 羡慕楼主,居然不用 RMDB 也能撑起业务。其实 RMDB 能不用就别用,毕竟麻烦。 另外,Redis \ MongoDB 这种,没遇到极端情况与场景,不会触发其不稳定问题,用起来当然好。 不然地球上最强数据库 Oracle 为啥能卖这么贵。 |
22 aima 2022-08-08 04:53:35 +08:00 via iPhone singlestore |
23 hoopan 2022-08-08 08:53:48 +08:00 之前也思考过这个问题,貌似没有这种数据库,还是要根据业务场景搭配使用。高并发场景,必然是 Redis 这类内存数据库,缺点是容量小、非关系型,目前只能放一些热数据。 |
24 dqzcwxb 2022-08-08 09:33:29 +08:00 jetcache 做好本机缓存+远程缓存,远程缓存可以是多层 |
25 tairan2006 2022-08-08 09:38:05 +08:00 redis lab 里面有支持 sql 的扩展,做好落盘的话,直接拿来当 db 用也行。 不过游戏场景,有时候 redis 都扛不住…… |
26 bthulu 2022-08-08 09:41:38 +08:00 有的, mysql 有内存数据库, 可以当缓存用 |
27 nothingistrue 2022-08-08 09:43:51 +08:00 如果你要知道缓存是干什么的,大概就不会这样问了。直接读取最终存储效率不够,于是弄个缓存提高读取效率。所以,只会出现因为数据库效率够了不要缓存的情况,不会出现数据库和缓存合一的情况。 |
![]() | 28 hst001 2022-08-08 10:26:00 +08:00 小项目没有问题,压力大了还是会回到 DB + Cache 那一套 |
![]() | 29 Martens 2022-08-08 10:30:51 +08:00 可不可以这样:玩家登陆直接把数据读到内存里,离线后把数据落盘 |
![]() | 30 huangwei8ku 2022-08-08 10:33:05 +08:00 @b00tyhunt3r clickhouse 了解下 |
![]() | 31 litguy 2022-08-08 10:37:56 +08:00 你们数据库存什么东西 如果只是简单记录 理论上 sqlite 都能有足够高 qps 大部分数据是可以通过 os 的 page cache 命中的 |
32 stevefan1999 2022-08-08 11:31:02 +08:00 不就是 NoSQL |
![]() | 33 zhangxzh 2022-08-08 12:39:00 +08:00 传统点的方案, Oracle TimesTen Application-Tier Database Cache |
34 wxdiy 2022-08-08 17:28:47 +08:00 游戏这么多年基本都是这么用的。用 C++基本都是进程内存缓存数据,有变化时或者定时同步到数据库。这种架构不好动吧,还是直接用这稳定的架构谢谢业务逻辑吧 |
35 whileFalse 2022-08-08 19:16:36 +08:00 via iPhone aws dynamodb 是一种 nosql 。 aws 官方支持内存缓存,启用后延迟从毫秒级缩短到微秒级,并且 api 和一致性不变,对应用层面是透明的。 |
36 whileFalse 2022-08-08 19:23:08 +08:00 via iPhone 另外 aws memorydb 是 redis 的强持久化版本。 |