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

为什么 MySQL 有缓存,还要使用 Redis?

  •  
  •   yodhcn ·
    yodhcn · 229 天前 · 6543 次点击
    这是一个创建于 229 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是上次面试中,虽然面试官问我的问题,当时给我问迷糊了。
    Q:为什么 MySQL 有缓存,还要使用 Redis ?
    A:MySQL 以前有缓存,但由于命中率不高,在新版本中已经舍弃掉了。
    Q:那 Oracle 数据库呢? Oracle 数据库有缓存吗?
    A:不清楚。
    Q:不论是 MySQL 还是 Oracle ,只要是数据库就应该都有缓存,那为什么数据库有缓存,还要使用 Redis ?
    A: Redis 支持分片集群,缓存容量容易扩展;而 MySQL 是为单机设计的,缓存容量受限于运行 MySQL 的主机内存。

    但面试官好像对这个回答不太满意
    现在回想起来,虽然当时是我混淆了“MySQL 查询缓存”和“MySQL 的 Buffer Pool”,但是,MySQL 的 Buffer Pool 也起到了缓存作用,减少磁盘 IO 。

    为什么 MySQL 有缓存,还要使用 Redis ?
    这个问题,目前我只想到从两个角度回答:
    1. Redis 支持分片集群,缓存容量容易扩展。
    2. 多级缓存。Redis 内存->Buffer Pool->磁盘。
    各位还有什么别的看法吗?
    46 条回复    2023-11-10 15:11:40 +08:00
    stinkytofu
        1
    stinkytofu  
       229 天前
    从自己的角度回答就好了, 我的项目引入 Redis, 那肯定是因为 Redis 速度快, 好用, 这就是最主要的原因!
    Maboroshii
        2
    Maboroshii  
       229 天前 via Android
    mysql 缓存不可控吧,你哪知道缓存了啥。
    amlee
        3
    amlee  
       229 天前
    mysql 做不了分布式缓存吧?
    ration
        4
    ration  
       229 天前 via Android
    1.redis 不止用于缓存 2.如上面所说可控性,还有缓存时间,缓存数据结构,很多方面都可以研究下
    Ericcccccccc
        5
    Ericcccccccc  
       229 天前
    如果单从为了获得 key-value 的角度来讲, redis 相比起 mysql 会更便宜.
    fredcc
        6
    fredcc  
       229 天前 via Android   ❤️ 4
    The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.
    哪怕 MySQL 有缓存,也是基于查询 SQL 的。不能代替业务级别的缓存。比如分布式应用情况下的用户会话缓存,又比如一个结果集是多个 SQL 查询结果经过业务逻辑处理后需要缓存。
    不知道面试官对比这两个东西出于什么目的。
    Worldispow
        7
    Worldispow  
       229 天前 via Android   ❤️ 2
    为什么用 redis 不用 oracle ?
    穷。
    wonderfulcxm
        8
    wonderfulcxm  
       229 天前 via iPhone
    @fredcc 为什么后来的 MySQL 要取消 query cache ?我发现 WordPress 官方给的优化建议有一条是开启 query cache ,在多读少写的站点,比如 blog 提速非常明显。
    dw2693734d
        9
    dw2693734d  
       229 天前   ❤️ 1
    为什么 MySQL 有缓存,硬盘还有设计缓存,CPU 也要设计缓存?
    devopsdogdog
        10
    devopsdogdog  
       229 天前 via Android
    更快的速度这点就够了。还有答的感觉就是刚工作和水瓶吧。
    devopsdogdog
        11
    devopsdogdog  
       229 天前 via Android
    补充一下,应该是想让你说 nosql 这类型的数据库区别吧。毕竟是不同类型的数据库
    darkengine
        12
    darkengine  
       229 天前
    我要缓存一些不是数据库查询出来的结果, 或者是查出来后经过程序加工过的数据, MySQL query cache 就用不上了.
    seth19960929
        13
    seth19960929  
       229 天前
    无它, 快
    buffzty
        14
    buffzty  
       229 天前
    一个是硬盘 io,一个是内存 io
    murmur
        15
    murmur  
       229 天前
    redis 可以缓存处理好的数据 直接就是和前端拿到的东西八九不离十了 连加工都省掉了
    OysterQAQ
        16
    OysterQAQ  
       229 天前
    可控性(包含对其进行操作,以及缓存粒度是方法级别还是对象级别),mysql 的缓存设计上就是面向 sql 尽量无感知的不可控的,缓存位于服务器层,甚至和存储引擎都是分离无关的
    iorilu
        17
    iorilu  
       229 天前   ❤️ 2
    两码事把

    redis 是主动缓存, 你知道缓存了啥

    数据库是自动缓存把, 他按他算法缓存, 但不一定是你要的
    ieliwb
        18
    ieliwb  
       229 天前
    2 个东西,一个是关系型数据库,一个是非关系型,使用场景不一样
    zjsxwc
        19
    zjsxwc  
       229 天前
    因为 Mysql 的 Query Cache 只能单机单核 CPU 才有效,不方便 scale 分布式,
    也因为 proxysql 这个能解决上面 Mysql 缺点的 mysql 中间代理层软件与 oracle 有 py 交易,让 oracle 把 mysql8.0 开始删掉了 Query Cache 功能。
    wy315700
        20
    wy315700  
       229 天前
    关于 Oracle 应该这么回答

    Oracle 一切都很好,不管是性能还是稳定性,唯一的缺点是:贵
    yabo083
        21
    yabo083  
       229 天前 via Android
    复习下八股:mysql 查询缓存的缺点:虽然可以提升查询性能,但是每次查询都要做一次缓存(如果失效的话,而失效的情况还很多),失效还要销毁。而且查询缓存在 8.0 以上版本已经不再支持。redis 优点:高性能,高并发( 1w qps ,mysql ; 10w~30w ,redis 单机+使用缓存)
    tyrantZhao
        22
    tyrantZhao  
       229 天前
    mysql 缓存是有限制的,并不是所有的内容都在内存中,而 redis 所有内容都在内存
    aijam
        23
    aijam  
       229 天前
    这不就和 CPU 有缓冲那为什么要有内存差不多道理吗
    yinmin
        24
    yinmin  
       229 天前 via iPhone
    最关键点是性能不一样
    PTLin
        25
    PTLin  
       229 天前   ❤️ 2
    查询速度不是一个量级的,MySQL 查询起码要进行 SQL 解析,查询计划分析不同索引的查询成本,把页加载到 Buffer 里,生成 ReadView ,B+树页的解析,条目的定位,层层的查询,返回给用户等等操作。
    redis ,直接走内存,用的数据结构也都是比较简单的 hashmap ,list ,skiplist 什么的,因为全在内存中,所以不需要使用 B 树这种可以部分读取的结构,速度自然就很快。
    Ericcccccccc
        26
    Ericcccccccc  
       229 天前
    想到另外一个问题, 面试官说的缓存很可能是 buffpool, 要是没有这玩意每次都去磁盘里读数据那是慢到姥姥家了. 很多慢查询都是冷数据 buffpool 里没有.
    opengps
        27
    opengps  
       229 天前
    MySQL 的缓存,存了索引和临时结果集,并不是彻底的之操作内存
    Kumo31
        28
    Kumo31  
       229 天前
    两码事,最根本的区别是他们的设计目的不一样,Redis 就是为内存而设计的,MySQL 等大部分 RDBMS 都是为磁盘设计的,这就导致 MySQL 的数据就算能全量存进内存,这一套查询结构的速度也比面向内存的设计慢的多
    tairan2006
        29
    tairan2006  
       229 天前
    MySQL 的数据结构和 Redis 差别很大啊

    如果只用 kv ,也可以用 memorycache ,并不一定非要 Redis

    而且关系型数据库的 kv ,也不支持过期吧
    me1onsoda
        30
    me1onsoda  
       229 天前
    @opengps 那这个结果集存在哪里呢
    hefish
        31
    hefish  
       229 天前   ❤️ 5
    这问题就笑笑吧。 为什么厂区养了条狗还要招保安。为什么家里有固定电话,还去买个手机?
    ccnocc
        32
    ccnocc  
       229 天前
    @Worldispow #7 还得是你
    nise
        33
    nise  
       229 天前
    从面试官的角度思考一下,应该是考你架构能力,不同的东西有不同的适用场景,这两个就不是一个东西,一个是关系型数据库,一个是 kv 系统,那你就扯一下关系型数据库用来干啥,kv 系统用来干啥。总之不要被他绕进去,思考一下这个问题背后
    julyclyde
        34
    julyclyde  
       229 天前
    mysql 现在没有缓存了吗?从哪个版本开始啊
    才几年没用,变化这么大啊
    seers
        35
    seers  
       229 天前   ❤️ 1
    估计已经没多少人听说过数据库要 warm up buffer pool 了,属于 DBA 的时代眼泪啊
    codewld
        36
    codewld  
       229 天前   ❤️ 1
    MySQL 缓存磁盘中的数据页,是对数据的缓存; Redis 缓存查询结果,是对结果的缓存
    princeofwales
        37
    princeofwales  
       228 天前
    oracle 的缓存,主要是 sga 里的 buffer cache 和 shared pool ,前者缓存从磁盘获取到的数据,后者缓存解析 sql 的中间值
    oracle 的内存数据库,是叫 timesten ,在一个公安的人口登录系统里搞过一次
    sleepm
        38
    sleepm  
       228 天前
    看业务需求
    比如,统计
    mysql 缓存,效率不高,比较写会比较频繁,缓存也没有意义了
    redis 的话,随便写随便读
    xuanbg
        39
    xuanbg  
       228 天前
    此缓存非彼缓存呀
    bianhui
        40
    bianhui  
       228 天前
    浏览器还有缓存,王者荣耀还有缓存了,为啥还用 redis 。两个压根不是一回事吧,不是说名字一样,描述的就是一种东西。
    8355
        41
    8355  
       228 天前
    其实面试官想听到的是为什么不使用 mysql 缓存。。。。
    mysql 缓存在数据变更后缓存失效,包括表结构变更,索引变更和数据变更。
    zzzmh
        42
    zzzmh  
       228 天前
    要是我我就回答 因为别人都在用 我凑热闹
    xiang0818
        43
    xiang0818  
       228 天前
    MySQL 有查询缓存功能可以缓存查询结果以提高查询性能,但是查询缓存有一些限制,例如缓存失效的开销、缓存命中率低等。此外,MySQL 的查询缓存功能在 MySQL 8.0 版本中已被弃用并在后续版本中被删除。

    相比之下,Redis 是一个内存数据存储,它提供了更高级的功能和更高的可伸缩性和高可用性。
    1 、Redis 支持不同类型的数据缓存,例如键值对、列表、哈希表、集合等。
    2 、Redis 还支持分布式缓存,可以在多个节点上进行缓存,提高了可伸缩性和高可用性。

    因此,虽然 MySQL 的缓存功能可以提高查询性能,但它的局限性较大。为了提高应用程序的性能和可伸缩性,使用 Redis 作为缓存存储通常是更好的选择,即使 MySQL 有缓存功能。
    gav1nvv
        44
    gav1nvv  
       228 天前   ❤️ 2
    Redis 和数据库的场景完全不同,并发量也完全不在一个量级,通常 Redis 会做集群用于,登陆 token 存储,临时数据存储,防止数据库穿透等用途,假如用关系数据库也可以实现,但是结构复杂,效率低下,一旦发生变更缓存失效(因为经常修改的话相当于没缓存)。面试官想问你的其实是关系型数据库和 key-value 数据库的区别和用途
    Pantheoon
        45
    Pantheoon  
       228 天前
    redis 可以缓存聚合的结果,是人为可控的,你想塞啥塞啥,mysql 的缓存更多的是它的查询优化,这个东西可控性比较低,而且它的逻辑只有它自己知道
    xiaoyureed
        46
    xiaoyureed  
       194 天前
    这个好回答呀, redis 缓存一般工作在业务层, 缓存的都是经过聚合/计算后的数据, 和数据库自己的缓存可差远了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:14 · PVG 20:14 · LAX 05:14 · JFK 08:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.