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

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

  •  
  •   b00tyhunt3r · Aug 7, 2022 · 6479 views
    This topic created in 1375 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
        1
    ynkkdev  
       Aug 7, 2022   ❤️ 3
    建议先搞清楚缓存和数据库用途的区别。。。
    b00tyhunt3r
        2
    b00tyhunt3r  
    OP
       Aug 7, 2022 via iPhone
    期待真大佬干货回答!!
    xsen
        3
    xsen  
       Aug 7, 2022
    若是针对扩容与复杂度的话,建议了解下分布式数据库,如国内的 TiDB 之类的

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

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

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

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

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

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

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

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