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

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

  •  
  •   yodhcn ·
    yodhcn · 2023-10-05 23:48:33 +08:00 · 6945 次点击
    这是一个创建于 405 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是上次面试中,虽然面试官问我的问题,当时给我问迷糊了。
    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  
       2023-10-05 23:51:13 +08:00
    从自己的角度回答就好了, 我的项目引入 Redis, 那肯定是因为 Redis 速度快, 好用, 这就是最主要的原因!
    Maboroshii
        2
    Maboroshii  
       2023-10-05 23:56:42 +08:00 via Android
    mysql 缓存不可控吧,你哪知道缓存了啥。
    amlee
        3
    amlee  
       2023-10-06 00:06:37 +08:00
    mysql 做不了分布式缓存吧?
    ration
        4
    ration  
       2023-10-06 00:11:36 +08:00 via Android
    1.redis 不止用于缓存 2.如上面所说可控性,还有缓存时间,缓存数据结构,很多方面都可以研究下
    Ericcccccccc
        5
    Ericcccccccc  
       2023-10-06 00:15:22 +08:00
    如果单从为了获得 key-value 的角度来讲, redis 相比起 mysql 会更便宜.
    fredcc
        6
    fredcc  
       2023-10-06 00:31:40 +08:00 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  
       2023-10-06 07:15:26 +08:00 via Android   ❤️ 2
    为什么用 redis 不用 oracle ?
    穷。
    wonderfulcxm
        8
    wonderfulcxm  
       2023-10-06 08:15:12 +08:00 via iPhone
    @fredcc 为什么后来的 MySQL 要取消 query cache ?我发现 WordPress 官方给的优化建议有一条是开启 query cache ,在多读少写的站点,比如 blog 提速非常明显。
    dw2693734d
        9
    dw2693734d  
       2023-10-06 08:24:52 +08:00   ❤️ 1
    为什么 MySQL 有缓存,硬盘还有设计缓存,CPU 也要设计缓存?
    devopsdogdog
        10
    devopsdogdog  
       2023-10-06 09:44:36 +08:00 via Android
    更快的速度这点就够了。还有答的感觉就是刚工作和水瓶吧。
    devopsdogdog
        11
    devopsdogdog  
       2023-10-06 09:47:33 +08:00 via Android
    补充一下,应该是想让你说 nosql 这类型的数据库区别吧。毕竟是不同类型的数据库
    darkengine
        12
    darkengine  
       2023-10-06 10:01:28 +08:00
    我要缓存一些不是数据库查询出来的结果, 或者是查出来后经过程序加工过的数据, MySQL query cache 就用不上了.
    seth19960929
        13
    seth19960929  
       2023-10-06 10:05:47 +08:00
    无它, 快
    buffzty
        14
    buffzty  
       2023-10-06 10:12:07 +08:00
    一个是硬盘 io,一个是内存 io
    murmur
        15
    murmur  
       2023-10-06 10:19:28 +08:00
    redis 可以缓存处理好的数据 直接就是和前端拿到的东西八九不离十了 连加工都省掉了
    OysterQAQ
        16
    OysterQAQ  
       2023-10-06 10:24:39 +08:00
    可控性(包含对其进行操作,以及缓存粒度是方法级别还是对象级别),mysql 的缓存设计上就是面向 sql 尽量无感知的不可控的,缓存位于服务器层,甚至和存储引擎都是分离无关的
    iorilu
        17
    iorilu  
       2023-10-06 10:33:35 +08:00   ❤️ 2
    两码事把

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

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

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

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

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

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

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