redis为什么要设计成单线程

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 说到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
相关文章
|
22天前
|
消息中间件 缓存 NoSQL
Redis快速度特性及为什么支持多线程及应用场景
Redis快速度特性及为什么支持多线程及应用场景
58 11
|
25天前
|
存储 缓存 NoSQL
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
|
12天前
|
NoSQL 关系型数据库 MySQL
简述redis的单线程模式
简述redis的单线程模式
|
1月前
|
Java Redis 数据安全/隐私保护
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
|
1月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
|
2月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
52 0
|
2月前
|
NoSQL Redis
Redis的单线程和高性能
Redis 的单线程主要是指 Redis 的网络 I0 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。 但Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
21 0
|
3月前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
40 3
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis -- 单线程模型
Redis -- 单线程模型
50 1
|
3月前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
45 3