我觉得最重要的一点是,redis作为一个内存数据库,内存操作是很快的。网络io是瓶颈,如果用多线程,还要引起线程切换,线程切换的开销是很大的,切换线程之后要保留现场,要做很多预处理。所以用单线程反而能起到更好的作用。
线程切换为什么开销大呢?举个简单的例子,我在看一篇文章,有个单词不认识,那我要去查词典。在查词典之前,我得要先记录我阅读到了那一页的哪一行,方便下次来继续读。那这样肯定是要影响我读书效率的。
我总结几点redis为什么要设计成单线程的原因
1. 都是通过网络来调用redis的,如果是内网调用情况稍微比外网调用好点。但是这些和内存操作的时间不是一个量级的。用单线程处理完全能应付。
2. redis是采用单线程-多路复用IO模型来实现高性能内存数据服务的。这样就避免了适用锁。网络层利用IO多路复用,这使用了内核级别的线程池,就是说还是存在并发的,只是在网络层的并发。但是网络Io本身是很慢的。是瓶颈。那么你在业务处理阶段设计再多的线程,使用再多的cpu内核,也没法逾越网络Io的瓶颈。
3. redis和传统的多线程服务器不同。比如tomcat这些,后端往往存在很重的IO操作,会产生长时间的等待。所以采用多线程是有必要的。
redis用单线程也不是没有问题。有一个很明显的问题就是。当进行一些复杂的集合操作的时候会使redis并发性下降。
解决办法是:你可以在一个多核的机器上部署多个redis实例。组成master-master,master-slave的形式,实现读写分离。耗时的读命令完全可以放到slave中。
----
粗浅理解,欢迎拍砖
近期热议
推荐标签 标签
-
Gzip
9 引用 • 12 回帖 • 179 关注
gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
-
TextBundle
1 引用 • 2 回帖 • 88 关注
TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。
-
OpenCV
15 引用 • 36 回帖 • 4 关注
-
Redis
284 引用 • 248 回帖
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。
-
Bootstrap
18 引用 • 33 回帖 • 648 关注
Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。
-
微服务
96 引用 • 155 回帖
微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。
-
服务器
125 引用 • 585 回帖
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
-
Word
13 引用 • 41 回帖
-
Kubernetes
118 引用 • 54 回帖 • 2 关注
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
-
旅游
98 引用 • 903 回帖
希望你我能在旅途中找到人生的下一站。
-
Unity
25 引用 • 7 回帖 • 121 关注
Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。
-
GraphQL
4 引用 • 3 回帖 • 11 关注
GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。
-
SSL
70 引用 • 193 回帖 • 413 关注
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。
-
OnlyOffice
4 引用 • 17 关注
-
Access
1 引用 • 3 回帖
-
Hexo
22 引用 • 148 回帖 • 7 关注
Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。
-
Ngui
7 引用 • 9 回帖 • 404 关注
Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。 -
小薇
35 引用 • 468 回帖 • 765 关注
小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。
由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!
-
负能量
89 引用 • 1251 回帖 • 393 关注
上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)
-
IBM
17 引用 • 53 回帖 • 143 关注
IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。
-
房星科技
6 引用 • 141 回帖 • 606 关注
房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。
-
创造
186 引用 • 1021 回帖
你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!
-
Hibernate
39 引用 • 103 回帖 • 728 关注
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
-
Wide
30 引用 • 218 回帖 • 644 关注
Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。
欢迎访问我们运维的实例: https://wide.b3log.org
-
黑曜石
24 引用 • 242 回帖
黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。
A second brain, for you, forever.
-
Anytype
3 引用 • 31 回帖 • 28 关注
-
数据库
345 引用 • 754 回帖
据说 99% 的性能瓶颈都在数据库。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于