当前位置:首页 > 数码 > Redis的单线程模型-探索简洁高效的数据处理方式 (redis的五种数据类型)

Redis的单线程模型-探索简洁高效的数据处理方式 (redis的五种数据类型)

admin7个月前 (04-20)数码21

Redis 是一款单线程数据库,这意味着它在处理客户端请求、解析请求、进行数据读写操作以及发送数据给客户端等过程中,使用的是一个线程(主线程)。这正是我们常说 Redis 是单线程的原因。

单线程模型的优点

  • 避免多线程之间的竞争和同步问题,简化程序设计和维护的复杂性。
  • 由于 Redis 主线程只负责处理请求和数据读写操作,不需要频繁地进行上下文切换,因此可以更高效地利用 CPU 资源。
  • 通过使用非阻塞 I/O 和事件驱动模型,能够处理大量的并发请求。

单线程模型的限制

  • 由于主线程负责所有的请求处理和数据操作,如果某个请求需要执行一个耗时的操作,那么其他请求会被阻塞,导致响应时间延长。

后台线程

Redis 并不完全是单线程的。在启动时,Redis 会启动后台线程(BIO)来处理一些特定任务:

  • 在 Redis 2.6 版本中,会启动两个后台线程,分别用于关闭文件和 AOF 刷盘等任务。
  • 在 Redis 4.0 版本之后,新增了一个后台线程,用于异步释放 Redis 内存,即 lazyfree 线程。

异步操作

例如,执行 unlinkkey flushdbasync flushallasync 等命令时,这些删除操作会交给后台线程来执行,这样可以避免 Redis 主线程的阻塞。因此,当我们需要删除一个大 key 时,不应使用 del 命令,因为 del 命令是在主线程中执行的,这会导致 Redis 主线程阻塞。相反,我们应该使用 unlink 命令来异步删除大 key。

结论

Redis 是一种单线程数据库,但并不意味着它完全没有多线程的支持。通过后台线程的引入,Redis 能够在保持单线程的简洁性和高效性的同时,处理一些特定任务和异步操作,提升了系统的性能和稳定性。


redis为什么那么快

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。 官方提供的数据是可以达到+的qps。 这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。 Redis快的主要原因是:1.完全基于内存2.数据结构简单,对数据操作也简单3.使用多路 I/O 复用模型第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。 多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。 和Memcached不同,Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。 在不同的系统调用选用适合的接口,linux下默认是epoll。 因为Libevent比较重更通用代码量也就很庞大,拥有很多Redis用不上的功能,Redis为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。 单进程单线程好处1.代码更清晰,处理逻辑更简单。 2.不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。 3.不存在多进程或者多线程导致的切换而消耗CPU。

Redis-I/O模型

Redis 单线程是指 Redis的网络IO和键值对读写 是由一个线程完成。这也是Redis提供存储服务的主流程。

对于一个多线程系统,在合理的资源分配情况下,提高线程数,可以有效的提高系统的吞吐量。但实际情况可能是,刚增加线程数时,系统吞吐量增加,但进一步增加线程数,吞吐量增长缓慢,甚至下降。

Redis

Redis采用多路复用机制,使其在网络I/O操作中可以大量并发处理客户端请求,实现高吞吐率。 I/O多路复用 在单线程中通过记录跟踪每一个I/O流的状态来管理多个I/O流。select, poll, epoll 都是I/O多路复用的具体的实现。

在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

图中FD就是套接字,当select/epoll一旦监测到FD上有请求到达时,就会出发相应的事件,这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来,Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。同时,Redis 在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为 Redis 一直在对事件队列进行处理,所以能及时响应客户端请求,提升 Redis 的响应性能。 事件到了,在处理,这就是反应器模式。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Redis

“Redis的单线程模型-探索简洁高效的数据处理方式 (redis的五种数据类型)” 的相关文章

Redis中分布式锁的防死锁机制 (redis中文网)

Redis中分布式锁的防死锁机制 (redis中文网)

分布式锁在分布式系统中是一种常见的需求。它用于防止对共享资源的并发访问,确保数据一致性和可靠性。在 Redis 中实现分布式锁可以通过使用 SETNX(SET if Not eXists)命令来尝...

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

这是一位同窗往年秋招参与得物一面遇到的疑问,完整面经如下: 这个疑问在面试中还是比拟容易遇到的,尤其是在调查性能优化相关常识点的时刻。 通常状况下,问了bigkey(大Key)还会继续...

上古程序猿推戴经常使用Redis的执著理由 (上古教程)

上古程序猿推戴经常使用Redis的执著理由 (上古教程)

最近,在知乎上看到这样一个疑问: 有些上古程序猿不时保持推戴经常使用怎样办? 终究用不用Redis?为什么用?怎样用?让咱们看看网友怎样说…… @灵剑...

成功多规则限流的思索与通常-Redis (成功的规则)

成功多规则限流的思索与通常-Redis (成功的规则)

市面上很多引见如何成功限流的,然而大局部都有一个缺陷,就是只能成功繁多的限流,比如1分钟访问1次或许60分钟访问10次这种,然而假构想一个接口两种规则都须要满足呢,咱们的名目又是散布式名目,应该如何处...

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

我们都知道在关于的开发或许面试的环节中,很容易就会遇到这个关于Redis耐久化的疑问,而我们在面试的时刻,经常会有小同伴只能说出这个Redis耐久化的两种形式,后续或许还会对比一些区别,然而关于怎...

Redis-中隐藏的慢动作-了解影响其速度的致命操作-揭秘 (redis淘汰策略有哪些)

Redis-中隐藏的慢动作-了解影响其速度的致命操作-揭秘 (redis淘汰策略有哪些)

Redis 的闪电般速度背后:数据结构的威力 在数据库领域,Redis 以其惊人的处理速度而著称。它的秘诀在于能够在微秒级别内查找数据并执行操作。这种速度优势源自于几个关键因素,其中数据结构发挥着至...

Redis内存治理与淘汰战略 (redis内存淘汰策略配置)

Redis内存治理与淘汰战略 (redis内存淘汰策略配置)

欢迎到来写代码那些事!在的环球里,内存治理是一门关键的艺术。本教程将带你深化了解Redis内存淘汰战略,教你如何在数据存储和性能之间找到最佳平衡点。 目录: 1.内存淘汰...

Redis轻松添加从节点-系统性能再飙升-零烦恼-零阻塞 (redis轻量级锁和redisson分布式锁的使用场景)

Redis轻松添加从节点-系统性能再飙升-零烦恼-零阻塞 (redis轻量级锁和redisson分布式锁的使用场景)

措施 配置复制积压缓冲区。 配置复制延迟。 增加主节点资源。 控制并发复制连接数。 从节点的磁盘写入延迟。 从节点的最大内存...