简述redis的单线程模式

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 简述redis的单线程模式

前言

在redis版本6之前,网络IO和键值对读写都是由一个线程来完成的。而redis的其他功能,比如持久化、异步删除、集群数据同步等,是由其他线程完成的。

为什么采用单线程

多线程有助于提升吞吐率(系统同时处理的请求数),但处理共享资源时,会带来额外的开销。设计有问题时,采用多线程甚至会造成性能下降。为了减少并发访问控制问题,redis直接采用单线程模式。

redis的大部分操作都是在内存上完成的,而且redis采用哈希表、跳表等性能良好的数据结构,以及多路复用机制,使得redis在单线程模式下也能实现高性能和高吞吐率。

linux的IO多路复用机制

Linux的IO多路复用机制指的是一个线程处理多个IO流,即select/epoll机制。内核一直监听套接字的请求,一旦有相关请求,就交给redis处理,从而实现redis线程处理多个IO流的效果。

为了在请求到达时能通知到Redis线程,select/epoll提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。相关事件被放到一个事件队列,redis单线程对该事件队列不断处理,避免一直轮询是否有请求发生造成CPU资源浪费。因为redis一直在处理事件队列,所以能及时响应请求。

redis单线程处理IO请求瓶颈

  1. 任意一个请求在server中一旦耗时较长,就会影响整个server的性能,也就是说,后面的请求都要等前面的先处理完。耗时操作包括以下几种:
  1. 操作big key:写入一个big key在分配内存时需要耗费一定时间。删除一个big key去释放内存也需要一定时间。
  2. 操作大量数据的命令。类似于mysql的select * from xxx的操作会占用大量时间。
  3. 大量key集中过期。
  4. 淘汰策略。内存不够用时,每次写入都要淘汰一些key,淘汰会耗时较长。
  5. AOF开启always机制,每次写入都将操作进行刷盘,拖慢redis性能
  6. 主从全量同步生成RDB:虽然采用fork子进程生成快照,但fork的一瞬间也会阻塞整个线程,实例越大,阻塞越久。
  1. 并发量非常大时,虽然采用了IO多路复用,但读写客户端数据依旧是同步IO,只能单线程依次读取客户端数据,无法利用CPU的多核。

redis6.0的多线程

redis6.0引入了多线程,但只是多线程处理网络IO请求,对于读写命令,redis仍然使用单线程处理。redis 6.0中,多线程机制默认是关闭的,相关配置:

# 启用多线程
io-threads-do-reads yes
# 设置线程数。官方建议小于主机CPU核数
io-threads 6

参考

  • 极客时间 - Redis核心技术与实战
相关实践学习
基于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
相关文章
|
26天前
|
监控 NoSQL 安全
如何在 Redis 中正确使用多线程?
【10月更文挑战第16天】正确使用 Redis 多线程需要综合考虑多个因素,并且需要在实践中不断摸索和总结经验。通过合理的配置和运用,多线程可以为 Redis 带来性能上的提升,同时也要注意避免可能出现的问题,以保障系统的稳定和可靠运行。
37 2
|
26天前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
30 1
|
7天前
|
消息中间件 NoSQL Redis
【赵渝强老师】Redis消息的生产者消费者模式
消息队列在Redis中可通过List数据结构实现,支持发布者订阅者和生产者消费者两种模式。生产者通过`lpush`向List添加消息,消费者通过`rpop`或`brpop`消费消息,后者支持阻塞等待。示例代码展示了如何使用Redis的生产者消费者模式。
|
1月前
|
存储 运维 NoSQL
Redis为什么最开始被设计成单线程而不是多线程
总之,Redis采用单线程设计是基于对系统特性的深刻洞察和权衡的结果。这种设计不仅保持了Redis的高性能,还确保了其代码的简洁性、可维护性以及部署的便捷性,使之成为众多应用场景下的首选数据存储解决方案。
40 1
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
60 4
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
24 2
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
56 1
|
1月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
44 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
2月前
|
NoSQL 网络协议 Unix
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
64 1
|
2月前
|
存储 消息中间件 NoSQL
Redis的单线程设计之谜:高性能与简洁并存
Redis的单线程设计之谜:高性能与简洁并存
43 0