Redis从单线程到多线程的转变

  • Redis简介
  • Redis单线程时代
    • `“单线程”`的Redis为什么会这么快?
  • Redis的瓶颈
  • 6.0版本后的Redis线程问题
    • redis的多线程不是你理解的多线程
    • redis的多线程是默认关闭的

Redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis单线程时代

  • Redis在起初严格意义上也不算纯粹的单线程

单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。比如持久化时,Redis就会开启一个子线程去操作。

“单线程”的Redis为什么会这么快?

Redis被广泛应用于缓存,一切皆源于Redis基于内存计算,它的读取速度要比寻常的RMDB(关系型数据库)快上很多。

  • Redis每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • Redis操作具有原子性,能保证并发情况下数据的安全性。
  • Rdis采用请求上的单线程,避免了不必要的上下文切换和线程间的资源竞争。
  • Redis采用了如非阻塞IO模型、IO的多路复用等多种IO模型。

Redis的瓶颈

先来看Redis的特性,Redis是基于内存进行操作的NoSql数据库。

  • 首先CPU不会成为Redis的瓶颈,这也是为什么单线程的Redis依然恐怖如斯的写照
  • Redis多用于高并发下做缓存,所以Redis的瓶颈最有可能是机器内存的大小或者网络带宽

6.0版本后的Redis线程问题

Redis的作者在 2019-12-19 发布了Redis 6.0 RC1,但是即便是这种大佬也没有逃过“真香定律”,Redis居然开始走上了多线程的潮流路线。也就是说从6.0开始Redis就是多线程的了,这也就意味着以后面试又多一个坑!

作者在自己博客中对新特性的介绍
原文地址:Redis 6.0 RC1 作者博客原文

Redis 6 被称为是 Redis 有史以来最大的一个版本,就在2020年五一期间,6.0稳定版本发布了。下面单就线程方面先了解一下新版本特性:

redis的多线程不是你理解的多线程

  1. 但跟 Memcached 这种从 IO 处理到数据访问多线程的实现模式有些差异。Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制 key、lua(一种轻量级脚本语言)、事务,LPUSH/LPOP(redis语法:将一个或多个值插入到列表头部(左边)、移出并获取列表的第一个元素(左边)) 等等的并发问题
  2. 主线程负责接收连接请求,读事件到来(收到请求)则放到一个全局等待读处理队列
  3. 主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程,然后主线程忙等待(spinlock 的效果)状态
  4. IO 线程将请求数据读取并解析完成(这里只是读数据和解析并不执行)
  5. 主线程执行所有命令并清空整个请求等待读处理队列(执行部分串行)

redis的多线程是默认关闭的

  1. Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:io-threads-do-reads yes
  2. 线程数设置通过修改redis.conf配置文件:io-threads属性指定线程数量。关于线程数的设置,官方有一个建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。
  3. 性能方面,Redis作者在RedisConf 2019的分享中提到,开启多线程后的Redis性能可以提升一倍左右

Redis新版本发布,你还认为Redis是单线程?相关推荐

  1. 你还不了解Redis的发布/订阅功能与Redis的Stream吗

    一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...

  2. redis java 发布订阅_【Redis学习系列】Redis发布订阅

    Redis 发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了 ...

  3. .net core 使用Redis的发布订阅

    Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...

  4. Redis 笔记系列(十一)——Redis的发布和订阅机制

    2019独角兽企业重金招聘Python工程师标准>>> 本文说的redis功能没啥大用处,大家知道有这回事情就好,我一笔带过. Redis的发布订阅 这是什么 进程间的一种消息通信模 ...

  5. 面试被问到Redis实现发布与订阅,手摸手教

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  6. Redis实现发布与订阅(转)

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  7. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  8. nginx+lua+redis 灰度发布实现方案

    背景: 公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分使用户使用微服务模块,其他用户使用传统项目.待微服务稳定.无bug后全部用户迁移至微服务系统. 以上为背景,实现此方案使用 ...

  9. 补习系列(13)-springboot redis 与发布订阅

    目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...

最新文章

  1. 爱了!安利一个相见恨晚的可视化学习网站
  2. Android的WebView控件载入网页显示速度慢的究极解决方案
  3. 压缩目录Linux常用的几种文件压缩解压方法
  4. 树言树语:谁动了苹果的弦
  5. win7 64 安装scikit-learn
  6. 理解 Android Build 系统
  7. Exchange2007 系列一:Exchange2007安装
  8. python发动机曲轴连杆动力学计算
  9. 三大特性--多态和多态性
  10. div中内部div横向布局
  11. oracle 942出错,oracle升级后exp出现oracle942错误
  12. mysql压测宕机_MySQL压测时Linux中断异常飚高,原来是因为...
  13. 祝你元宵节快乐!今朝逢元夜,花与灯依旧。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。...
  14. 美媒称俄黑客造成卡塔尔断交潮 俄:啥事都栽给我
  15. 再携手,齐并进!菊风助力宁波银行坐席PUSH外呼项目
  16. 腾讯云直播是什么?操作文档
  17. 十几套IT培训视频教程免费下载,为你节省几万元培训费用
  18. 微信小程序开发聊天室——实时聊天,支持图片预览
  19. 大数据Flink安装部署
  20. 电子商务中数据分析的八大指标体系

热门文章

  1. linux如何在文件末尾添加空行,如何在文件末尾添加换行符?
  2. torch.onnx.export详细介绍
  3. 在codecademy上学习Python
  4. U盘安装Linux系统教程
  5. CSS基础之 背景属性设置
  6. 以太坊开发入门,完整入门篇(小白可以看看,高手看看自己有没有遗漏的
  7. linux一些简单的操作命令
  8. violate关键字---java高并发
  9. php 滑块 爬虫_phpspider爬虫框架如何爬取异步加载的数据?
  10. SVN 如何解决冲突?