redis为什么要设计成单线程

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 说到Redis的特点,很容易想到的就是属于Nosql,速度快。再说到Redis为什么速度快,你头脑中第一闪过的可能就是说Redis基于内存、单线程执行了。基于内存这点不用过多解释,Redis将数据存在内存中,没有了磁盘I/O过程。但要说到单线程为什么快,不熟悉的人可能说不清楚。接下来就说说单线程的Redis为什么快,开发者是怎么设计的呢。

前言

说到Redis的特点,很容易想到的就是属于Nosql,速度快。再说到Redis为什么速度快,你头脑中第一闪过的可能就是说Redis基于内存、单线程执行了。

基于内存这点不用过多解释,Redis将数据存在内存中,没有了磁盘I/O过程。但要说到单线程为什么快,不熟悉的人可能说不清楚。接下来就说说单线程的Redis为什么快,开发者是怎么设计的呢。

Redis只有单线程吗?

说到Redis是单线程的,意思是Redis只有单线程吗?显然不是,我们所说的单线程,指的是Redis处理网络IO及其使用最多的Redis数据读写都是由单线程来完成的,而Redis其他的功能如数据的持久化、主从数据同步等,都是由其他的线程来执行的。

Redis主要功能为什么要用单线程呢?按理来说多线程不应该更快嘛,这就需要知道多线程的开销问题。

多线程的开销

多线程如果能合理的进行资源分配,确实可以增加响应的吞吐。但是,如果没有协调好硬件资源,就可能出现事倍功半的结果。

因为在系统中经常有被很多线程同时访问的资源,多线程要访问这个资源,为了保证数据的准确性,就得用别的方法比如锁机制来控制。这样一来多线程的优势就没了,所以,Redis就直接采用了单线程。

单线程的优势

单线程的Redis有处理十万级qps的能力,这是为什么呢?原因总结有2点:

  • redis在内存上执行主要操作,再加上使用了高效的底层数据结构如哈希表、压缩列表、跳表等。
  • Redis采用的多路复用机制,在处理网络IO上发挥了巨大作用。

第一点大家估计比较熟悉,但第二点多路复用机制是什么呢?我们来了解看看。

多路复用机制

几个概念需要了解一下:

  • select:当被监听的文件描述符就绪后就会通知系统,但是无法知道具体是哪个文件描述符,因此只能遍历所有的文件描述符来获取。遍历的这个动作就会造成性能损失,另外select最多可监听的描述符是有上限的。
  • poll:和select机制一样,也得遍历去获取具体的文件描述符。
  • epoll:就是熟知的多路复用。当有文件描述符就绪时,可以知道具体哪个描述符,省去了遍历的过程,因此性能远超select和poll。

Redis采用了多路复用机制,当监测到文件描述符的请求时,就会触发相应事件。而这些事件会进入一个队列,Redis单线程就对队列做处理就行了,这样一来Redis就不需要去轮询哪个请求,从而浪费资源了。

image.png

小结

Redis不仅仅有单线程,只不过主要读写操作是用单线程去处理的。Redis单线程快的原因,一部分是因为使用了优秀的底层数据结构,另一部分就是采用了IO多路复用机制来处理请求,避免了轮询耗时的动作。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
监控 NoSQL 安全
如何在 Redis 中正确使用多线程?
【10月更文挑战第16天】正确使用 Redis 多线程需要综合考虑多个因素,并且需要在实践中不断摸索和总结经验。通过合理的配置和运用,多线程可以为 Redis 带来性能上的提升,同时也要注意避免可能出现的问题,以保障系统的稳定和可靠运行。
90 2
|
4月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
101 1
|
2月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
70 1
|
5月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
127 20
剖析 Redis List 消息队列的三种消费线程模型
|
4月前
|
存储 运维 NoSQL
Redis为什么最开始被设计成单线程而不是多线程
总之,Redis采用单线程设计是基于对系统特性的深刻洞察和权衡的结果。这种设计不仅保持了Redis的高性能,还确保了其代码的简洁性、可维护性以及部署的便捷性,使之成为众多应用场景下的首选数据存储解决方案。
56 1
|
4月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
74 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
5月前
|
NoSQL 网络协议 Unix
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
126 1
|
5月前
|
存储 消息中间件 NoSQL
Redis的单线程设计之谜:高性能与简洁并存
Redis的单线程设计之谜:高性能与简洁并存
59 1
|
7月前
|
消息中间件 缓存 NoSQL
Redis快速度特性及为什么支持多线程及应用场景
Redis快速度特性及为什么支持多线程及应用场景
142 11
|
6月前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题