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性能可以提升一倍左右
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章