在一次磁盘操作中,CPU不是瓶颈,瓶颈是内存和网络,IO操作,所以redis是通过在提高CPU的利用上,增加处理速率。
一般提高CPU的利用是通过多线程,一般线程数是cpu核数的2倍,但是redis是通过单线程实现的;一方面是因为多线程存在上下文切换(用户态和内核态的切换)消耗问题,另一方面是因为redis采用IO多路复用机制。
面试时,redis被问到了3次,每一次都是一个惨痛的教训,希望读者朋友们进行深度思考,不要让面试官一下就问倒,工作时的项目真的很锻炼人,一个安逸的环境对于我这种懒人就是温水煮青蛙。
下面就redis的多路复用机制,进行复盘总结!
首先说下IO基础
NIO堆外内存
很早的时候进行文件操作都是通过inputstream和outputstream,通过流的方式。
现在广泛用NIO,基于通道channel,通道是双向的,基于buffer,主要就是快,并非之前的流。
Buffer的类结构图:
HeapByteBuffer是堆内内存;
MappedByteBuffer和DirectByteBuff是基于堆外内存的;
堆内内存(on-heap memory) = 新生代+老年代+持久代
jvm参数中只要使用-Xms,-Xmx等参数