面试---缓存
redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis要比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发?)
redis支持服务器端的数据操作;
由于redis只使用单核,而memcached可以使用多核,所以平均每一个核上redis在存储小数据时比memcached性能更高。而在100k以上的数据中memcached性能要高于redis。
memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是redis目前是原生支持cluster模式的;
redis的线程模型是单线程模型。他内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以redis才叫做单线程的模型。它采用IO多路复用同时监听多个socket,将产生事件的socket压入内存队列,文件事件分派器根据socket上的事件类型来选择对应的事件处理器进行处理
文件事件处理器的结构包含4个部分:①多个socket;②IO多路复用程序③文件事件分派器④事件处理器(命令请求处理器、命令回复处理器、连接应答处理器等等)
客户端和redis一次通信的流程:
Redis为什么采用单线程模型
1.Redis的所有操作都是基于内存的,而CPU不是Redis的瓶颈。
2.Redis使用多路复用来快速处理请求。
3.单线程编程容易并且更容易维护,不存在死锁、线程上下文切换等问题。
Redis 为什么要引入多线程呢?
Redis 的瓶颈并不在 CPU,而在内存和网络。内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。
为什么Redis单线程模型也能效率这么高?
1.纯内存操作。
2.核心是基于非阻塞的IO多路复用机制。
3.单线程同时也避免了多线程的上下文频繁切换问题,预防了多线程可能产生的竞争问题。
什么是多线程编程中的上下文切换?
多线程编程中一般线程的个数都大于CPU核心的个数,而一个CPU核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就是属于一次上下文切换。
上下文切换 (context switch) , 其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运行另外的任务时, 它保存正在运行任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中, 入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器, 并开始下一个任务的运行, 这一过程就是context switch。
概括的说:当前任务在执行完CPU时间片切换到另一个我任务之前会先保存自己的状态,以便下次在切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换.