一、Redis为什么快
-
纯内存K-V操作
数据库的工作模式按存储方式分为了磁盘数据库和内存数据库。Redis将数据存储在内存中,并且绝大多数命令都不会受到磁盘 IO 速度的限制,所以速度极快。此外,Redis内部采用了 HashMap 这种数据结构,从根本上获得了优势,因为 HashMap 无论是查找和操作的时间复杂度都是
O(1)
。 -
采用了多路复用的I/O机制
Redis是单线程的,但它底层使用了多路复用 I/O 机制。多路 /O 复用模型是指利用
select、poll、epoll
同时监察多个流的 I/O 事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒。程序会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法避免了大量的无用操作。 -
数据结构简单,操作节省时间
在 Redis 中,有以下五种常用的数据结构:
- String:字符串类型,通常用作缓存、计数器和分布式锁等;
- List:链表类型,用作队列、微博关注人时间轴列表等;
- Hash:可以用于存储用户信息、hash表等;
- Set:集合类型,用于去重、赞、踩、共同好友等;
- Zset:有序集合,用于访问量排行榜、点击量排行榜等。
此外,Redis对数据结构做了很多优化,诸如压缩表、对短数据进行压缩存储、跳表等,都加快了读取速度。
二、为什么Redis是单线程的
Redis是单线程的! 这一点是毋庸置疑的(好吧,Redis 6.0 网络读写部分是多线程的)。那为什么Redis使用单线程呢?而且还能有这么快的响应速度。
Redis is single threaded. How can I exploit multiple CPU / cores?
It’s not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.
However, to maximize CPU usage you can start multiple ins