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