疑问:redis 虽然是单线程,为啥效率这么高?速度这么快呢?你为啥使用 redis 呢?
注意,我们无论比较的是哪一个特性,都是以 mysql、oracle、sql server 作为参照的~
那么主要有以下几个方面~
1. redis 访问的是内存,而数据库访问的是硬盘
这点毋庸置疑,内存的访问速度是硬盘访问速度的很多倍.
2. redis 核心功能比 数据库 的核心功能更简单
数据库对于数据的插入删除查询修改... 都有更复杂的功能支持,这些功能势必会带来更多的开销,比如,插入功能,mysql 的各种约束就会使数据库做很多额外的工作.
redis 的操作都是对一些数据结构直接进行的简单操作,干的活少,功能相比于 mysql 也是少了不少~
3. redis 采用单线程模型,避免了一些不必要的线程竞争开销
redis 每一个操作都是 “短、平、快” 的,就是简单操作一下内存数据,不是什么特别消耗 cpu 的操作,就算搞多个线程,提升也不是很多~
4. redis 处理网络 IO 的时候,使用了 epoll 这样的 IO 多路复用机制
针对 TCP 来说,一个服务器有多个客户端,而每一个客户端都需要分配一个 socket ,这些 socket 并不都是无时不刻的在传输数据,很多情况下,大部分的 socket 都是 “静默” 的,没看什么要传输的数据(例如,用户登录像 csdn 这种博客网站以后,大多数时间都是在浏览博客,而不是不停的点击发请求......),同一时刻,只有少数 socket 是活跃的,因此,一旦客户端多路,线程就多了,系统的开销也就大了(线程创建、销毁、调度)。
因此 redis 就是采用 IO 多路复用(Linux 上提供的 IO 多路复用,主要就是 epoll 这套 API),也就是一个线程可以管理多个 socket.
怎么理解一个线程可以管理多个 socket 呢?
举个例子,我小时候生活的那个小区门口,有很多小摊,早上的时候,家里人一般都起不来,不想自己做饭,那么一般就是由我来给我爸妈买饭,但是呢,他们又吃不到一块去,我妈喜欢吃面皮,俺爸就喜欢吃肉夹馍,而我喜欢吃炒面,那我买早饭就有一下三种策略:
- 我自己去买,先买面皮,等面皮好了以后再去买肉夹馍,等肉夹馍好了以后再去买炒面,当然啦,这种效率是最低的~
- 我们三个人一起去买,我去买炒面,我妈去买面皮、我爸去买肉夹馍,这样,虽然效率大大提升了,但是系统开销大了~
- 我自己去买,先去买面皮,等的过程中再去买肉夹馍,再等的过程中去买炒面,然后这三份哪个先好了,对应的老板就可以喊我一嗓子(epoll 事件通知/回调机制),此时就能让我一个线程同时做三件事,但前提是,这三件事的交互不频繁,大部分时间都在等~ 如果这三件事都是交互特别频繁的(比如联机游戏、线上直播、上传视频...)还是多搞几个线程靠谱,一个线程就忙不过来了~
5. Redis 是 C语言 开发的(个人并不认可这个说法)
网上还有一种说法是 Redis 是使用 C 语言开发,所以快。这点我个人不是很认可,因为 MySQL 也是同样也是 C 语言开发的,凭什么 Redis 就更快呢?