【Redis】听说Redis是单进程单线程的?

很久很久以前,在某公司的会议室里正在进行一场面试…

面试官:看到你简历上写着“熟练掌握Redis”,你说说对Redis的理解。

马D梅:Redis作为一款流行的缓存中间件,其显著的性能是由于单进程单线程的设计…

面试官:等等,你说Redis是单进程单线程的?

马D梅:这个…(我记得网上都是这么说的…)


结论一:Redis并不是纯粹的单进程单线程。

可能有小伙伴会有疑问,为什么会是这个结论?

举个简单的栗子就可以证明Redis并不单纯是单进程单线程运行的。
在这里插入图片描述
我们都知道Redis有两种持久化的方式,一种是RDB,一种是AOF。

拿RDB举例,执行bgsave,就意味着 fork 出一个子进程在后台进行备份。

这也就为什么执行完bgsave命令之后,还能对该Redis实例继续其他的操作。


结论二:对于大多数的操作,Redis是单进程单线程的。

为了解释为什么Redis以单线程的方式处理数据性能会比较高,这里需要先讲一点多线程的知识。

多线程并不一定意味着快。
在这里插入图片描述
上图我们可以看到,这两个线程所执行的任务都是计算型任务。

一个CPU处理多个请求会导致单个请求响应时间过长;而且频繁切换线程上下文会增加性能损耗。

那为什么我们还总是使用多线程?
在这里插入图片描述
我们知道,大多数任务中都会涉及到网络请求、IO读取(包括文件、数据库等)等操作,这些都会产生一定的阻塞问题,那么这时候多线程就产生作用了。

当线程-3发生阻塞时,如果不进行切换,那就是白白占用CPU的资源,此时CPU是空闲的;反之,切换到其他线程,CPU则执行其他线程的任务,不至于没事情可干、偷偷在摸鱼。

这也就是为什么Redis处理大部分请求时都是单线程的,并因此获得显著的性能。就是因为Redis处理的这些请求都是计算型,并且Redis是纯内存操作,再加上带有I/O多路复用功能。

纯属个人见解,如有错误,欢迎指出。

发布了107 篇原创文章 · 获赞 88 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Code_shadow/article/details/104622349
今日推荐