redis的一个特点是读写速度快,这就很容易让人误以为redis是多线程的。因为大家想当然的会认为多线程的效率要比单线程高,其实不然。
BAT的一个对redis有很深了解的高级工程师曾经说过,redis就是如果所有数据都在内存里,那么单线程是效率最高的。为什么这么说呢,多线程的本质是CPU模拟出多个线程去操作,但是模拟是有代价的,学过操作系统的朋友应该知道,多线程之间切换是要切换上下文的,这也是对时间的一种消耗。所以,对于单处理器来说,当然是单线程,无切换才是最高效率的。redis就是用一块CPU绑定了一块内存,然后对数据的操作都是在这块内存上进行的,基于此,单线程的redis已经达到了效率最大化。
大家用实际数据来说明。
一次CPU内存的切换大约需要1500ns,从内存中读取1MB的数据,大概需要250us,就算偶一次只读1MB的数据,读1000次之后,消耗在内存切换上这种非功能性过程上的消耗就达到了1500us,这个时间开销任谁看都是不值。
此外,基于redis的单线程,大家还可以利用它提供的set key field value加nx参数的方式,来实现分布式锁。众所周知,redis并不适合做数据持久层,更多的是取代memcache做缓存,做分布式架构的支撑。分布式架构势必就要面临如何实现分布式锁的问题,通过上面的接口,无论多少个分布式节点,都可以准确的获取分布式锁。
具体使用方式如下:通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回空,否则才返回1。因此用这个函数来执行获取分布式锁操作,如果返回值不为空,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。
此外,还有PX,XX参数,具体含义见如下文档。
以上是偶的浅见,欢迎各位在下方与偶交流沟通。
偶是苏苏思量,来自BAT的Java开发工程师,每天分享科技类见闻,欢迎各位关注偶,与偶共同进步。