为什么 Redis 单线程却能支撑高并发?
lipiwang 2025-06-10 16:24 4 浏览 0 评论
为什么Redis单线程却能支撑高并发?
Redis 和 memcached 有什么区别?
Redis 的线程模型是什么?
为什么 Redis 单线程却能支撑高并发?
这个是问 Redis 的时候,最基本的问题吧,Redis 最基本的一个内部原理和特点,就是 Redis 实际上是个单线程工作模型,你要是这个都不知道,那后面玩儿 Redis 的时候,出了问题岂不是什么都不知道?
还有可能面试官会问问你 Redis 和 memcached 的区别,但是 memcached 是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是 Redis ,没什么公司用 memcached 了。
Redis 和 memcached 有啥区别?
存储方式:memcached 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis 有部分存在硬盘上,这样能保证数据的持久性。
数据支持类型: memcached 对数据类型支持相对简单。 Redis 有复杂的数据类型。
底层模型: 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
Redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, Redis 会是不错的选择。
Redis 原生支持集群模式
在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
性能对比
由于 Redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis,虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
redis 的线程模型
Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所以每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。
Redis 内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。也就是说Redis 的单线程指的是执行 Redis 命令的核心模块是单线程的,而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的,Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象、以及通过 Redis 模块实现的阻塞命令等。Redis 采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分: 多个 socket、IO 多路复用程序、文件事件分派器、事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
客户端 socket01 向 Redis 的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。
假设此时客户端发送了一个 set key value 请求,此时 Redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的 AE_READABLE 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置。操作完成后,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。
如果此时客户端准备好接收返回结果了,那么 Redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。
这样便完成了一次通信。
为啥 Redis 单线程模型也能效率这么高?总结起来就是以下几点:
- 纯内存访问:数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。
- 非阻塞I/O:Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间。
- 单线程避免了线程切换和竞态产生的消耗。
Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库。我们还可以来参考知乎上大佬们的讨论加深自己的理解:redis为什么是单线程?在多核处理器下对主存的访问真的比多线程更有效率?未来有可能改用多线程吗?
并发和并行通常被认为是不同的概念,有什么区别?
1、并发性I/O流,意味着能够让一个计算单元来处理来自多个客户端的流请求。
2、并行性,意味着服务器能够同时执行几个事情(具有多个计算单元),这是不同的。
例如,酒吧能够服务几个顾客,同时他只能一次准备一个饮料。所以他可以提供没有并行性的并发服务。
Redis虽然是单线程程序,但可以通过使用I / O多路复用同一个线程和事件循环在I / O级别上提供并发性, 像Redis这样的高效存储引擎的瓶颈通常是网络,在CPU之上。
因此,Redis原子性(隔离事件循环)在没有额外成本的情况下提供并发性(不需要进程、线程同步),无需支付同步开销。
并行性有一个代价:现在硬件设备都是多核,当然多核速度肯定比单核效率高,但进程线程之间的同步是非常昂贵的。 好比,人家redis只要一台服务器可以搞定的事情,你干嘛一定要让我使用多台服务器。 它轻巧,可作为构建高效可扩展的服务器,何必纠结一定要装波音747的发动机(对应的设计比较复杂), redis设计有它自己架构的好处!官网也说了,要发挥多核CPU性能,可以通过在单机开多个Redis core实例来完善,一样实现分布式。
相关推荐
- Redis 常见面试问题总结和答案(redisson面试题)
-
什么是Redis?Redis(RemoteDictionaryServer)Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Ke...
- 青云QingCloud新增Memcached功能 完善缓存集
-
北京2015年1月30日电/美通社/--基础云服务商青云QingCloud日前宣布,为了更好的满足用户对缓存服务多样性的需求,正式推出基于Memcached的缓存集群服务。此次发布的M...
- 还不懂什么是Redis?一文详解Redis,入门学习看这一篇就够了
-
在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量...
- redis一些常见的面试题(附答案)(redis经典面试题)
-
1、什么是redis?Redis是一个基于内存的高性能key-value数据库。2、Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统...
- Java面试官最爱问的那些Redis面试题盘点
-
一、概述二、数据类型STRINGLISTSETHASHZSET三、数据结构字典跳跃表四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它五、Redis与Memcached数据类型数据持久化...
- Redis为什么「操作速度」这么快以及在实际开发中的「应用场景」
-
Redis在目前分布式开发大环境下应用的场景比较多,但是大家有没有思考过为什么大家都愿意使用Redis呢?以及Redis为什么速度会这么快的原因呢?还有我们实际开发过程中使用Redis的场景又有哪些呢...
- Redis分片(分布式缓存)(redis分片存储)
-
分片(partitioning)就是将你的数据拆分到多个Redis实例的过程,这样每个实例将只包含所有键的子集.(相关推荐:Redis教程)1分片何用Redis的分片承担着两个主要目标:o允...
- 您应该了解的20大系统设计概念(系统设计有哪些)
-
您应该了解的20大系统设计概念我应该从基础开始,比如可扩展性、可用性、可靠性这些。这些都是系统设计的核心要素。接下来,可能需要考虑性能相关的,比如延迟和吞吐量,这两者常常被一起讨论。然后是存储,数据库...
- 一文彻底弄懂 TPS RPS QPS(tps/cps)
-
以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- 为什么 Redis 单线程却能支撑高并发?
-
#暑期创作大赛#为什么Redis单线程却能支撑高并发?Redis和memcached有什么区别?Redis的线程模型是什么?为什么Redis单线程却能支撑高并发?这个是问Redis的...
- 值得一看的35个Redis面试题总结(redis面试题汇总)
-
Redis是一个基于内存的高性能key-value数据库。作者:民工哥1.什么是redis?Redis是一个基于内存的高性能key-value数据库。2.Reids的特点 Redis本质上是一...
- 内存数据库优缺点一览:Redis、Memcached、MongoDB和Ignite
-
内存数据库是一种将数据存储在内存中的数据库,相比于传统的磁盘数据库,内存数据库具有更高的性能、更低的延迟和更好的并发能力。内存数据库广泛应用于高速缓存、实时分析、游戏、社交网络等场景。本文将对比介绍四...
- Java面试 | 关于Redis 的面试题(redis面试题2021)
-
1.Redis是什么?Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因...
- 数字化与智能化技术:分布式缓存数据库Redis
-
一、Redis概述Redis远程字典服务(RemoteDictionaryServer),是一个开源的使用ANSIC语言编写的,基于内存的分布式缓存Key-Value数据库。1、Redis数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)