👌redis为什么这么快?
口语化回答
redis 的快主要得益于以下几个点,第一个就是纯内存的操作,相比磁盘来说,纯内存带来的速度提升非常大。其次就是合理的数据结构和数据编码设计。像不同的数据类型所对应的底层结构都会有变化,基本上作者让我们在 o1 的复杂度内就可以读取到我们想要的值。还有就是单线程,因为在内存,所以压力瓶颈一般在网络和 cpu,单线程完全足够,这使得 redis 不需要考虑切换的消耗。以及 redis 采取了 io 多路复用,减少了网络压力,提高了吞吐量。以上就是 redis 这么快的原因。
题目解析
经典题目了,主要是看你对内存的速度有没有一个思考性的了解,知道内存比磁盘快的多,有这种思维,可以在平时开发的时候多注意。还有就是考察单线程不需要考虑切换和争抢的性能问题。io 多路复用是 redis 的比较特色的东西。再深一点就是要考察你对数据类型的底层结构有没有具体的了解了。
面试得分点
内存,数据结构,单线程,io 多路复用
题目详细答案
结论
redis 巨快,巨快,操作毫秒级,qps 可达 10w+。
主要原因
纯内存
Redis将数据存储在内存中,避免了大量访问数据库和直接读取磁盘数据的操作。内存的读写速度远超过磁盘I/O,使得Redis的数据访问非常迅速。
数据结构合理
Redis内部的数据结构都是为快速读写而设计的,如跳跃表、SDS(简单动态字符串)、链表和Hash等。基本都能够在 o(1)复杂度下完成大部分操作,比如 hash 的结构,想获取其中一个属性的值,非常的方便,不像数据库查询需要磁盘寻找。
单线程操作
Redis采用单线程模型来处理客户端请求,避免了多线程带来的上下文切换和竞争条件。单线程模型使得Redis不需要考虑各种锁的问题,减少了性能消耗。但是持久化,异步删除等等是异步线程处理,但这不影响性能。不过要注意一个点,因为单线程,某个命令如果耗时太大,可能会产生阻塞,也就是我们经常说的,不要使用 keys,或者直接读整个 hash 大 key。
io 多路复用模型
Redis在网络通信和磁盘写入方面采用了异步式的IO处理,即使用epoll多路复用技术同时处理多个网络请求,减少了I/O阻塞及上下文切换开销,提高了系统的吞吐量和响应时间。
专门设计的数据结构
redis 的每种数据类型对应的底层存储结构都不一样,经历过多种方式的设计。拿 string 类型来进行说,如果存储数字的话,是用int类型的编码。如果存储非数字,小于等于39字节的字符串,是embstr。大于39个字节,则是raw编码。这种根据类型和字节数的设计,在 key 越多的场景下,占用空间越少。