redis三大特点
1.Redis是基于内存,内存的读写是非常快的 2.Redis是单线程,省去了线程之间的切换并且防止了死锁现象发生 3.Redis采用多路复用的技术,可以处理并发的连接(客户端连接不占用线程资源,当指令发送成功之后通过单线程)
为什么Redis是单线程
因为Redis是基于内存,cpu已经无法成为Redis的瓶颈,Redis最有可能影响性能的就是机器的内存与网络带宽,并且可以使用多开客户端的方案解决并发连接,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
单线程的优劣势
1.优点 单线程逻辑清晰,代码简单 2.缺点 无法发挥多核cpu的全部性能,但是可以使用多开客户端的方式解决并发的问题。
题外
1.原子性 原子性指的是一条计算机指令发出之后不会被其他线程影响而终止。
redis 的多路复用很好的实现了程序指令的原子性 比如 java 中i++并不是原子性操作他其实是经过了三个步骤 1.从内存中取出 值 2.i++ 3.将i++的值赋值给内存
问 两个线程进行100次 i++ 最大值是多少? 最小值是多少?
(下面是我复制过来的)
假设两个线程的执行步骤如下:
-
线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存中为0; -
线程B执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU2的寄存器中值为1,内存中为0; -
线程A继续执行完成第99次i++,并把值放回内存,此时CPU1中寄存器的值为99,内存中为99; -
线程B继续执行第一次i++,将其值放回内存,此时CPU2中的寄存器值为1,内存中为1; -
线程A执行第100次i++,将内存中的值取回CPU1的寄存器,并执行加1,此时CPU1的寄存器中的值为2,内存中为1; -
线程B执行完所有操作,并将其放回内存,此时CPU2的寄存器值为100,内存中为100; -
线程A执行100次操作的最后一部分,将CPU1中的寄存器值放回内存,内存中值为2; 【其实他想什么时候从内存中拿 什么时候从cpu返回都是可以的可能的 我们这说的是一种可能】
答:最大值是200 最小是2
|