V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
b00tyhunt3r
V2EX  ›  程序员

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

  •  
  •   b00tyhunt3r · 2022-08-07 14:23:47 +08:00 · 5389 次点击
    这是一个创建于 870 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    请大佬现身说法!!!

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

    当然,你游戏场景的这不算太复杂;分布式数据库之所以提出来,是因为基于传统的 SQL 数据库,在数据量海量情况下,要做在线或离线数据分析所以额外的大数据分析之类方案结合进来,会导致异常复杂
    b00tyhunt3r
        4
    b00tyhunt3r  
    OP
       2022-08-07 16:35:24 +08:00
    @xsen
    感觉有点杀鸡牛刀了吧。。。确实如你所说,游戏场景并不复杂,但是对性能要求却极高,这也是大部分时候我需要把数据存在内存的原因,
    但是内存数据落地后的处理就有不一致的风险,
    所以我现在思考的是能否去掉缓存 /DB 其中一端,来消除不一致性的一个成因,并减少开发复杂度?
    我听说 PostgreSQL 自带 Cache 功能,如果使用 DB 自带的 Cache 层,那还需要引入 Redis 等外部软件吗?
    mrsatangel
        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 分片啊。
    geekvcn
        6
    geekvcn  
       2022-08-07 17:39:58 +08:00 via iPhone
    对内存容量要求未来应该可以不用太焦虑了,钱够就趁着 Intel 傲腾停产前多存点货,或者等 CXL 生态成熟,内存容量以后都不是事。以后数据库应该会围绕 CXL 生态开发,以后内存会分为 CPU 封装的高速 HMB 内存,CPU 扩展的 DDR 内存,CXL 扩展大容量共享内存池
    ryalu
        7
    ryalu  
       2022-08-07 18:33:33 +08:00
    aws 推出的 [memoryDB]( https://aws.amazon.com/cn/blogs/china/comparison-of-amazon-memorydb-and-amazon-elasticache/) 会不会成为未来的一种趋势
    wctml
        8
    wctml  
       2022-08-07 18:50:20 +08:00
    Lighfer
        9
    Lighfer  
       2022-08-07 21:20:32 +08:00
    apache ignite ?
    killpanda
        10
    killpanda  
       2022-08-07 21:27:52 +08:00
    couchabase
    killpanda
        11
    killpanda  
       2022-08-07 21:27:58 +08:00
    couchbase
    roundgis
        12
    roundgis  
       2022-08-07 21:32:12 +08:00 via Android
    現在單機都可以支持 1T ram

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

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

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

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

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