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. 心得14-hibernate的优化2-抓取(fetch)
  3. python 0o-377 -0o377_Python : 反射
  4. 【干货】产品运营中极具战略意义的环节:数据分析
  5. 分布式系统的可靠协调系统——Zookeeper
  6. 圣迪奥康扉多功能防辐射卡
  7. 编写自己的Arduino库
  8. HTML小知识点积累
  9. WPF简单的口算案例
  10. 难题:嵌套computeIfAbsent
  11. android中访问手机存储空间,android – 访问手机内部存储以推入SQLite数据库文件...
  12. leetcode1103. 分糖果 II 该模拟就模拟,别老想着优化
  13. ElasticSearch 从安装开始_01
  14. 如何快速教妹子学Python?这个方法火了!
  15. 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
  16. 在Array原型链上扩展remove,contain等方法所遇到的坑
  17. 新年放大招:Github 私库免费了!
  18. data image java_图像标签示例_图像识别 Image_SDK参考_使用SDK(Java)_华为云
  19. Web前端大作业 HTML+CSS+JS 防天天生鲜官网 9页
  20. oeasy教您玩转vim - 2 - # 使用帮助

热门文章

  1. stata质别变量赋值_【STATA学习笔记】虚拟变量的生成
  2. Ubuntu中install.sh文件如何执行
  3. 深圳大学计算机刘霖,深圳大学传播学院
  4. PClint 使用教程
  5. 图书管理系统——C语言版
  6. Microsoft Teams全生命周期会议-03你了解MeetingRoom吗
  7. REST风格和使用RESTful形式开发
  8. 利用Arcgis Engine 二次开发的使用和总结
  9. python IDE环境
  10. Hilbert曲线介绍以及代码实现