排障手册 - 电脑故障排查与系统优化实用指南

当前位置:首页 > 数码 > 正文内容

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

admin3年前 (2024-04-20)数码372

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数据类型)

作为面试经验丰富的开发人员,肯定会遇到过这样的问题,做了数据删除操作,为什么使用top命令时,仍然显示Redis占用了大量内存,答案这是因为当数据删除后,Redis释放的内存空间会由内存分配器管理,并不会立即返回给操作系统,所以,操作系统仍…

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

IntroductionRedisisanefficientin,memorydatabasedesignedtostoredatainvariousformats,suchasstrings,lists,sets,sortedsets,a…

大厂Redis重试战略剖析-深化摸索行业通常 (大厂redis面试题)

大厂Redis重试战略剖析-深化摸索行业通常 (大厂redis面试题)

受网络和运转环境影响,运行程序或许遇到临时性缺点,如刹时网络颤抖、服务临时无法用、服务忙碌造成超时等,智能重试机制可大幅防止此类缺点,保证操作成功口头,1引发临时性缺点的要素1.1缺点触发了高可用机制云支持节点肥壮形态监测,当监测到实例中的…

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

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

这是一位同窗往年秋招参与得物一面遇到的疑问,完整面经如下,这个疑问在面试中还是比拟容易遇到的,尤其是在调查性能优化相关常识点的时刻,通常状况下,问了bigkey,大Key,还会继续问hotkey,热Key,即使不预备面试也倡导看看,实践开发…

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

引言在分布式系统中,数据分片和负载均衡是至关重要的,哈希槽和一致性哈希两种方法都可以实现这些目标,但它们各有优缺点,本文将讨论为什么在某些情况下使用哈希槽而不是一致性哈希,哈希槽哈希槽是一种使用哈希函数将数据分片的方法,哈希函数将数据映射到…

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

Redis许可变更,开源界的巨石导言近来,内存数据库供应商Redis宣布了一项重大变更,该变更将在开源界掀起轩然大波,Redis将转向双许可模式,并采用更严格的许可条款,此举引起了社区的广泛不满和担忧,许可条款变更自Redis7.4版本起,…

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

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

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

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

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

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