典型回答 Redis是基于内存的,MySQL是基于磁盘的(非Memory引擎),所以Redis要比MySQL快,一次RT要分两部分,一部分是网络交互的耗时,一部分是命令(SQL)执行的耗时。但是不管怎么说,Redis都要比MySQL快得多。
先说下纯命令(SQL)执行耗时情况。
Redis命令执行耗时 Redis的简单命令(如<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">GET</font>、<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">SET</font>)执行耗时大概在0.1ms~1ms(100-1000微秒)。复杂命令(如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ZADD</font>**、**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">HSET</font>**)的执行耗时大概在1ms~5ms左右。
下图是阿里云给出的Redis和云上服务的对比图,可以看到,Redis的P99基本都在1毫秒以内的。(测试环境:标准架构(双副本),不启用集群, 8 GB)
测评地址:https://help.aliyun.com/zh/redis/support/performance-whitepaper-of-community-edition-instances
MySQL的SQL运行耗时 首先,对于MySQL来说,命中索引、命中buffer pool,无join等等都对性能有很大的影响。但是还是能给出一些大致的范围的。
如果一个查询,直接命中buffer pool并且通过主键查询,那么可能在2ms以内也能返回。比Redis慢不了多少。
如果没有命中buffer pool,就需要去磁盘读取,这时候就需要更多的耗时了,一般我们认为一次查询如果超过1秒钟算是慢SQL了,所以,一个正常的查询语句,应该在1000ms内返回,我们普遍认为200ms-500ms以内算是比较好的一个性能了。
以上说的不包括任何的网络交互的时长,还要再加上网络耗时,那么网络耗时怎么算的呢?
网络耗时 一次HTTP交互过程包括DNS解析、TCP握手、LS握手、HTTP请求、HTTP响应几个步骤了。那么一次请求(非HTTP 3.0的情况)就是:
1 2 3 4 5 DNS解析(5ms~300ms) → TCP握手(1.5×RTT) → TLS握手(1×RTT) → HTTP请求/响应(1×RTT) 总耗时 = DNS + 3.5×RTT 大概3.5个RTT加上DNS解析的耗时了。
...