面试 = 水平测试,并不是面试官要为难你,是要确定你的水平
-
这几个题,讲的很全面,言简意赅。并且对问题有深度。
- Redis有哪些数据结构?
- 使用过Redis分布式锁么,它是什么回事?
- 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
- 使用过Redis做异步队列么,你是怎么用的?
- 如果有大量的key需要设置同一时间过期,一般需要注意什么?
- Redis如何做持久化的?
- Pipeline有什么好处,为什么要用pipeline?
- Redis的同步机制了解么?
- 是否使用过Redis集群,集群的原理是什么?有哪几种集群方式?各有什么好坏?
- Redis是单线程还是多线程?
- Redis 可以处理的并发量?
- Redis 为什么那么快?
- 纯内存操作
- I/O 多路复用
-
专门针对I/O多路复用技术做了了解,因为对Linux底层技术不了解,这里有个例子,算是明白了I/O多路复用是干嘛的了。
=========
下面举一个例子,模拟一个tcp服务器处理30个客户socket。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:
- 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
- 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
- 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。
这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。
这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。
================
自己的理解:
Redis是采用TCP连接的,连接TCP的socket在所有数据准备好之前,socket不可用。请求是进来了,数据包还不完整,所以还不能处理这个请求。
那么对于已经准备数据包的socket,Redis线程可以一次性这些请求都接收来,然后去内存处理。都处理完后,将结果再都带回到socket。接下来再去处理准备好的socket。
所以redis的多路复用,不是每一个请求处理一次,而是一次处理多个请求。所以纯内存操作的单线程,效率也很高。