• 请不要在回答技术问题时复制粘贴 AI 生成的内容
b00tyhunt3r
V2EX  ›  程序员

是否存在数据库,缓存层合一的解决方案?

  •  
  •   b00tyhunt3r · Aug 7, 2022 · 6995 views
    This topic created in 1549 days ago, the information mentioned may be changed or developed.

    楼主背景游戏服务器开发, 一直以来沿用的是老一套 DB + redis/memcache 的形式来做存储。虽然方案比较稳定了,但是在扩容和复杂度上一直感觉不是那么直观。 看到过有一些公司直接舍弃 DB 层,只用一个 redis 定时持久化做存储, 但感觉小规模的项目还行,数据量上去了对内存要求会不会过大呢? 也见过有人舍弃缓存层只用 Postgres 来存储,据说百万级并发请求性能只比 redis 慢 1 倍?

    另外问一下 MongoDB 算不算是一个 DB/Cache 合一的解决方案呢?就是我项目里只用一个 MongoDB ,MySQL/Postgre/redis 之流通通不要

    请大佬现身说法!!!

    36 replies  •  2022-08-08 19:23:08 +08:00
    ynkkdev
    ynkkdev
    Aug 7, 2022❤️3
    1
    建议先搞清楚缓存和数据库用途的区别。。。
    b00tyhunt3r
    b00tyhunt3r
    OP
    Aug 7, 2022 via iPhone
    2
    期待真大佬干货回答!!
    xsen
    xsen
    Aug 7, 2022
    3
    若是针对扩容与复杂度的话,建议了解下分布式数据库,如国内的 TiDB 之类的

    当然,你游戏场景的这不算太复杂;分布式数据库之所以提出来,是因为基于传统的 SQL 数据库,在数据量海量情况下,要做在线或离线数据分析所以额外的大数据分析之类方案结合进来,会导致异常复杂
    b00tyhunt3r
    b00tyhunt3r
    OP
    Aug 7, 2022
    4
    @xsen
    感觉有点杀鸡牛刀了吧。。。确实如你所说,游戏场景并不复杂,但是对性能要求却极高,这也是大部分时候我需要把数据存在内存的原因,
    但是内存数据落地后的处理就有不一致的风险,
    所以我现在思考的是能否去掉缓存 /DB 其中一端,来消除不一致性的一个成因,并减少开发复杂度?
    我听说 PostgreSQL 自带 Cache 功能,如果使用 DB 自带的 Cache 层,那还需要引入 Redis 等外部软件吗?
    mrsatangel
    mrsatangel
    Aug 7, 2022
    5
    - DB 的 cache 对外保持 ACID 的语义,Redis 压根就不是事务型数据库;
    - DB 的 cache 是 page 维度的,Redis 作为 cache 的数据是 key 维度的;

    去掉缓存:损失性能;
    去掉 DB:损失 durability 。但是也不能不能解,比如前段时间太监了的 optane 这种;

    Redis 的扩展性问题:老东家见过很多九百多 GB 的 redis 实例;实在不行还可以按 key 分片啊。
    geekvcn
    geekvcn
    Aug 7, 2022 via iPhone
    6
    对内存容量要求未来应该可以不用太焦虑了,钱够就趁着 Intel 傲腾停产前多存点货,或者等 CXL 生态成熟,内存容量以后都不是事。以后数据库应该会围绕 CXL 生态开发,以后内存会分为 CPU 封装的高速 HMB 内存,CPU 扩展的 DDR 内存,CXL 扩展大容量共享内存池
    ryan961
    ryan961
    Aug 7, 2022
    7
    aws 推出的 [memoryDB]( https://aws.amazon.com/cn/blogs/china/comparison-of-amazon-memorydb-and-amazon-elasticache/) 会不会成为未来的一种趋势
    wctml
    wctml
    Aug 7, 2022
    8
    Lighfer
    Lighfer
    Aug 7, 2022
    9
    apache ignite ?
    killpanda
    killpanda
    Aug 7, 2022
    10
    couchabase
    killpanda
    killpanda
    Aug 7, 2022
    11
    couchbase
    roundgis
    roundgis
    Aug 7, 2022 via Android
    12
    現在單機都可以支持 1T ram

    大部分的場景也夠用了吧
    noparking188
    noparking188
    Aug 7, 2022
    13
    之前看的 V 站一个老哥回帖说,他们公司 MySQL 内存给几十上百 TB ,缓存开到最大,基本上数据都在内存里了

    楼主你的场景和痛点没详细描述,不大好给你建议
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Aug 7, 2022 via Android
    14
    游戏的局内信息一般都不持久化的吧,局外信息也没有多高的性能需求啊
    nicebird
    nicebird
    Aug 7, 2022
    15
    tcaplusDB
    joesonw
    joesonw
    Aug 7, 2022 via iPhone
    16
    redis 有落盘的,可以按 key hash 做分布式,特别适合游戏场景,公司里有用到 2 个多 T 的。一般玩家的相关数据都是按玩家 id hash 。
    linoder
    linoder
    Aug 7, 2022 via Android
    17
    tidb
    fkdtz
    fkdtz
    Aug 8, 2022
    18
    本质上来说还是 AP 和 CP 的取舍问题,没有办法既要高性能高可用,又要很强的一致性,只能根据业务场景来搭配使用。
    iwdmb
    iwdmb
    Aug 8, 2022
    19
    Cassandra
    akira
    akira
    Aug 8, 2022
    20
    你一个游戏能有多少人 多少数据哦。。只看数据规模的话,redis 肯定是完全足够了的
    documentzhangx66
    documentzhangx66
    Aug 8, 2022
    21
    羡慕楼主,居然不用 RMDB 也能撑起业务。其实 RMDB 能不用就别用,毕竟麻烦。

    另外,Redis \ MongoDB 这种,没遇到极端情况与场景,不会触发其不稳定问题,用起来当然好。

    不然地球上最强数据库 Oracle 为啥能卖这么贵。
    aima
    aima
    Aug 8, 2022 via iPhone
    22
    singlestore
    hoopan
    hoopan
    Aug 8, 2022
    23
    之前也思考过这个问题,貌似没有这种数据库,还是要根据业务场景搭配使用。高并发场景,必然是 Redis 这类内存数据库,缺点是容量小、非关系型,目前只能放一些热数据。
    dqzcwxb
    dqzcwxb
    Aug 8, 2022
    24
    jetcache 做好本机缓存+远程缓存,远程缓存可以是多层
    keenkiller
    keenkiller
    Aug 8, 2022
    25
    redis lab 里面有支持 sql 的扩展,做好落盘的话,直接拿来当 db 用也行。

    不过游戏场景,有时候 redis 都扛不住……
    bthulu
    bthulu
    Aug 8, 2022
    26
    有的, mysql 有内存数据库, 可以当缓存用
    nothingistrue
    nothingistrue
    Aug 8, 2022
    27
    如果你要知道缓存是干什么的,大概就不会这样问了。直接读取最终存储效率不够,于是弄个缓存提高读取效率。所以,只会出现因为数据库效率够了不要缓存的情况,不会出现数据库和缓存合一的情况。
    hst001
    hst001
    Aug 8, 2022
    28
    小项目没有问题,压力大了还是会回到 DB + Cache 那一套
    Martens
    Martens
    Aug 8, 2022
    29
    可不可以这样:玩家登陆直接把数据读到内存里,离线后把数据落盘
    huangwei8ku
    huangwei8ku
    Aug 8, 2022
    30
    @b00tyhunt3r clickhouse 了解下
    litguy
    litguy
    Aug 8, 2022
    31
    你们数据库存什么东西
    如果只是简单记录
    理论上 sqlite 都能有足够高 qps
    大部分数据是可以通过 os 的 page cache 命中的
    stevefan1999
    stevefan1999
    Aug 8, 2022
    32
    這不就是 NoSQL 嗎
    zhangxzh
    zhangxzh
    Aug 8, 2022
    33
    传统点的方案, Oracle TimesTen Application-Tier Database Cache
    wxdiy
    wxdiy
    Aug 8, 2022
    34
    游戏这么多年基本都是这么用的。用 C++基本都是进程内存缓存数据,有变化时或者定时同步到数据库。这种架构不好动吧,还是直接用这稳定的架构谢谢业务逻辑吧
    whileFalse
    whileFalse
    Aug 8, 2022 via iPhone
    35
    aws dynamodb 是一种 nosql 。
    aws 官方支持内存缓存,启用后延迟从毫秒级缩短到微秒级,并且 api 和一致性不变,对应用层面是透明的。
    whileFalse
    whileFalse
    Aug 8, 2022 via iPhone
    36
    另外 aws memorydb 是 redis 的强持久化版本。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1558 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 17:43 · PVG 01:43 · LAX 09:43 · JFK 12:43
    ♥ Do have faith in what you're doing.