“ 在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈,我们也知道Redis的查询速度比直接查数据库要快,因为Redis将数据存在内存中,而Mysql的查询是执行IO操作。那么他们之间到底有多大的差距呢?”
新的一周已经开始,不知道小伙伴今天状态可好啊?状态的好坏关系到学习和工作效率。工具也是一样,专注的方向不同,决定了在不同的场景,会有各自的优势。今天给大家带来的是,Mysql和Redis在项目中的查询速度的差距。
01
—
实例
首先我们看一张图片:
我想大家都很熟悉这张图片,打开网页调试,在日常工作中应该是很频繁的,但是你是否注意到这张图?
这张图上面有很多时间数据,这些数据是我们一次请求,在各个方面所用的时间。我们会发现其中TTFB最耗时,那么什么是TTFB呢?第一张百度百科的图已经告诉你答案:TTFB是最初的网络请求被发起到从服务器接收到第一个字节前所花费的毫秒数。也就是说:通过这个数据我们能知道我们接口的效率如何?那这跟我们今天所讲的东西有关系吗?
现在我写了一个接口,用于返回数据,一种从数据库去取数据,一种是从Redis中取数据,结果其实早就可以预料到,但是如果想知道差距到底有多大。请继续浏览下去吧。
先说一下对比的条件:首先Redis和Mysql都是部署在远程服务器上(同一台)。其次接口是相同,在Service层开始区分以哪种形式获取数据(代码如下)。最后他们值是相同的,我已经将数据库返回的数据存到Redis中。
public List<XcxKnowVO> getKnow(int id) {
if (redisCache.getObj("getKnow") != null && id == 2) {
List<XcxKnowVO> xcxKnowVOS = (List<XcxKnowVO>) redisCache.getObj("getKnow");
return xcxKnowVOS;
} else {
return xcxKnowDao.getKnow();
}
}
第一次测试(这一次两种请求都是第一次连接,在测试一种后,重启服务再测试第二种,保证条件大致是相同的)。
结果:我们发现初次加载,Mysql耗时用了2.67s。而redis用了847.84ms。他们都是初次加载,在第一次请求后,我重启了服务然后在访问redis数据源(效果如下)
Mysql:2.67s
redis:847.84ms
第二次测试(每种请求都试过一次后,也就是建立连接后,我们再刷新一次)。
结果是:我们发现mysql用了996.98ms。而redis用了114.77ms。(效果图如下)
Mysql:
Redis:
虽然Mysql在第二次时间大大缩短,但是同Redis相比,仍然是有差距的。在不同的服务器上可能差距会不同,这个跟服务器的硬件也是有关系的。说到这里你们想知道上面的差距代表了什么吗?
用一个例子来说明这种效果代表着什么:
人眼的反应速度大约是十分之一秒,或者更高,但最高不超过三十左右。一般认为在24分之一。反应时间。
也就是说100ms左右的加载速度,人眼看到的基本上就是秒加载了。
这里的对比并不是说Mysql不好,而且这个对比也是有一定的问题,因为本人的SQL查询语句可能优化并不是特别好。同时我们也要知道NoSQL也是有它本身的缺陷:
1. 不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本;
2. 支持的特性不够丰富:现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等。
好了,既然我们知道Redis查询速度要比直接查询Mysql要快,那么如何合理的在项目中运用Redis呢?请继续关明天的文章,今天就讲到这里,希望大家能有一个充实的一周。
那么今天小程序更新的题库是什么呢?
今天小程序更新的题目是:
1.Redis集群方案什么情况下会导致整个集群不可用?
2.Redis支持的Java客户端都有哪些?官方推荐用哪个
3.Jedis与Redisson对比有什么优缺点?
4.说说Redis哈希槽的概念?
5.Redis集群会有写操作丢失吗?为什么?