V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b00tyhunt3r
V2EX  ›  程序员

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

  •  
  •   b00tyhunt3r · 296 天前 · 4393 次点击
    这是一个创建于 296 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主背景游戏服务器开发, 一直以来沿用的是老一套 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  
       296 天前   ❤️ 3
    建议先搞清楚缓存和数据库用途的区别。。。
    b00tyhunt3r
        2
    b00tyhunt3r  
    OP
       296 天前 via iPhone
    期待真大佬干货回答!!
    xsen
        3
    xsen  
       296 天前
    若是针对扩容与复杂度的话,建议了解下分布式数据库,如国内的 TiDB 之类的

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

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

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

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

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

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

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

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