这是上次面试中,虽然面试官问我的问题,当时给我问迷糊了。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->磁盘。各位还有什么别的看法吗?

从自己的角度回答就好了, 我的项目引入 Redis, 那肯定是因为 Redis 速度快, 好用, 这就是最主要的原因!

mysql 缓存不可控吧,你哪知道缓存了啥。

mysql 做不了分布式缓存吧?

1.redis 不止用于缓存 2.如上面所说可控性,还有缓存时间,缓存数据结构,很多方面都可以研究下

如果单从为了获得 key-value 的角度来讲, redis 相比起 mysql 会更便宜.

The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.哪怕 MySQL 有缓存,也是基于查询 SQL 的。不能代替业务级别的缓存。比如分布式应用情况下的用户会话缓存,又比如一个结果集是多个 SQL 查询结果经过业务逻辑处理后需要缓存。不知道面试官对比这两个东西出于什么目的。

为什么用 redis 不用 oracle ?穷。

为什么后来的 MySQL 要取消 query cache ?我发现 WordPress 官方给的优化建议有一条是开启 query cache ,在多读少写的站点,比如 blog 提速非常明显。

为什么 MySQL 有缓存,硬盘还有设计缓存,CPU 也要设计缓存?

更快的速度这点就够了。还有答的感觉就是刚工作和水瓶吧。

补充一下,应该是想让你说 nosql 这类型的数据库区别吧。毕竟是不同类型的数据库

我要缓存一些不是数据库查询出来的结果, 或者是查出来后经过程序加工过的数据, MySQL query cache 就用不上了.

无它, 快

一个是硬盘 io,一个是内存 io

redis 可以缓存处理好的数据 直接就是和前端拿到的东西八九不离十了 连加工都省掉了

可控性(包含对其进行操作,以及缓存粒度是方法级别还是对象级别),mysql 的缓存设计上就是面向 sql 尽量无感知的不可控的,缓存位于服务器层,甚至和存储引擎都是分离无关的

两码事把redis 是主动缓存, 你知道缓存了啥数据库是自动缓存把, 他按他算法缓存, 但不一定是你要的

2 个东西,一个是关系型数据库,一个是非关系型,使用场景不一样

因为 Mysql 的 Query Cache 只能单机单核 CPU 才有效,不方便 scale 分布式,也因为 proxysql 这个能解决上面 Mysql 缺点的 mysql 中间代理层软件与 oracle 有 py 交易,让 oracle 把 mysql8.0 开始删掉了 Query Cache 功能。

关于 Oracle 应该这么回答Oracle 一切都很好,不管是性能还是稳定性,唯一的缺点是:贵

复习下八股:mysql 查询缓存的缺点:虽然可以提升查询性能,但是每次查询都要做一次缓存(如果失效的话,而失效的情况还很多),失效还要销毁。而且查询缓存在 8.0 以上版本已经不再支持。redis 优点:高性能,高并发( 1w qps ,mysql ; 10w~30w ,redis 单机+使用缓存)

mysql 缓存是有限制的,并不是所有的内容都在内存中,而 redis 所有内容都在内存

这不就和 CPU 有缓冲那为什么要有内存差不多道理吗

最关键点是性能不一样

查询速度不是一个量级的,MySQL 查询起码要进行 SQL 解析,查询计划分析不同索引的查询成本,把页加载到 Buffer 里,生成 ReadView ,B+树页的解析,条目的定位,层层的查询,返回给用户等等操作。redis ,直接走内存,用的数据结构也都是比较简单的 hashmap ,list ,skiplist 什么的,因为全在内存中,所以不需要使用 B 树这种可以部分读取的结构,速度自然就很快。

想到另外一个问题, 面试官说的缓存很可能是 buffpool, 要是没有这玩意每次都去磁盘里读数据那是慢到姥姥家了. 很多慢查询都是冷数据 buffpool 里没有.

MySQL 的缓存,存了索引和临时结果集,并不是彻底的之操作内存

两码事,最根本的区别是他们的设计目的不一样,Redis 就是为内存而设计的,MySQL 等大部分 RDBMS 都是为磁盘设计的,这就导致 MySQL 的数据就算能全量存进内存,这一套查询结构的速度也比面向内存的设计慢的多

MySQL 的数据结构和 Redis 差别很大啊如果只用 kv ,也可以用 memorycache ,并不一定非要 Redis而且关系型数据库的 kv ,也不支持过期吧

那这个结果集存在哪里呢

这问题就笑笑吧。 为什么厂区养了条狗还要招保安。为什么家里有固定电话,还去买个手机?

#7 还得是你

从面试官的角度思考一下,应该是考你架构能力,不同的东西有不同的适用场景,这两个就不是一个东西,一个是关系型数据库,一个是 kv 系统,那你就扯一下关系型数据库用来干啥,kv 系统用来干啥。总之不要被他绕进去,思考一下这个问题背后

mysql 现在没有缓存了吗?从哪个版本开始啊才几年没用,变化这么大啊

估计已经没多少人听说过数据库要 warm up buffer pool 了,属于 DBA 的时代眼泪啊

MySQL 缓存磁盘中的数据页,是对数据的缓存; Redis 缓存查询结果,是对结果的缓存