首页 >

Redis为何设计为单线程 – 数据库 – 前端|

coreldraw12怎么在图片上排版,英雄战歌不挂vpn会卡怎么办,怎么设置显卡运行Redis为何设计为单线程 - 数据库 - 前端|Redis为何设计为单线程

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开发工程师,每天分享科技类见闻,欢迎各位关注偶,与偶共同进步。


Redis为何设计为单线程 - 数据库 - 前端|
  • oracle取连续值 - 数据库 - 前端|
  • oracle取连续值 - 数据库 - 前端| | oracle取连续值 - 数据库 - 前端| ...

    Redis为何设计为单线程 - 数据库 - 前端|
  • mysql哪个好 - 数据库 - 前端,加大mysql的内存吗
  • mysql哪个好 - 数据库 - 前端,加大mysql的内存吗 | mysql哪个好 - 数据库 - 前端,加大mysql的内存吗 ...

    Redis为何设计为单线程 - 数据库 - 前端|
  • 怎么弄每一页有页眉 - 数据库 - 前端|
  • 怎么弄每一页有页眉 - 数据库 - 前端| | 怎么弄每一页有页眉 - 数据库 - 前端| ...