Redis 6.0多线程介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 6.0多线程介绍相关的知识,希望对你有一定的参考价值。

参考技术A

Redis作为一个基于内存的缓存系统,一直以高性能著称,
在单线程处理情况下,读速度可达到11万次/s,写速度达到8.1万次/s。

官方曾做过类似问题的回复:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。

但是,单线程的设计也给Redis带来一些问题:

针对上面问题,Redis在4.0版本以及6.0版本分别引入了Lazy Free以及多线程IO,逐步向多线程过渡。

 

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:

Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接。
文件事件就是服务器对套接字操作的抽象

服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。
(eg: 连接accept,read,write,close等)

Redis服务器中的一些操作(eg: serverCron函数)需要在给定的时间点执行。
时间事件就是服务器对这类定时操作的抽象
(eg: 过期键清理,服务状态统计等)

Redis将文件事件和时间事件进行抽象,时间轮询器会监听I/O事件表:
一旦有文件事件就绪,Redis就会优先处理文件事件,
接着处理时间事件。
在上述所有事件处理上,Redis都是以单线程形式处理,所以说Redis是单线程的。
处理过程见下图

Redis基于Reactor模式开发了自己的I/O事件处理器,也就是文件事件处理器。
Redis在I/O事件处理上,采用了I/O多路复用技术,同时监听多个套接字,
并为套接字关联不同的事件处理函数,通过一个线程实现了多客户端并发处理。
处理过程见下图

上述的设计,在数据处理上避免了加锁操作,既使得实现上足够简洁,也保证了其高性能。
当然, Redis单线程只是指其在事件处理上 ,实际上,Redis也并不是单线程的,比如生成RDB文件,就会fork一个子进程来实现。

 

背景:
客户端向Redis发送一条耗时较长的命令,比如删除一个含有上百万对象的Set键,或者执行flushdb,flushall操作,
Redis服务器需要回收大量的内存空间,导致服务器卡住好几秒,对负载较高的缓存系统而言将会是个灾难。

为了解决这个问题,在Redis 4.0版本引入了Lazy Free, 将慢操作异步化 ,这也是在事件处理上向多线程迈进了一步。

将大键的删除操作异步化,采用非阻塞删除(对应命令UNLINK)。
大键的空间回收交由单独线程实现,主线程只做关系解除,可以快速返回,继续处理其他事件,避免服务器长时间阻塞。

意义:
Redis在4.0版本引入了Lazy Free,自此Redis有了一个 Lazy Free线程专门用于大键的回收
同时,也去掉了聚合类型的共享对象,这为多线程带来可能。
这为Redis在6.0版本实现了多线程I/O打下了基础。

 

Redis 6.0的多线程并未将事件处理改成多线程,而是在I/O上。
因为,如果把事件处理改成多线程,不但会导致锁竞争,而且会有频繁的上下文切换,
即使用分段锁来减少竞争,对Redis内核也会有较大改动,性能也不一定有明显提升。

流程简述如下:

见下图

 

Redis6.0的多线程默认是禁用的,只使用主线程。
如需开启需要修改redis.conf配置文件:

开启多线程后,还需要设置线程数,否则是不生效的。
同样修改redis.conf配置文件:

redis如何执行redis命令

Redis 命令

Redis 命令用于在 redis 服务上执行操作。所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cmd窗口,将路径定位到Redis安装目录下,通过redis-server命令执行。

要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中,也就是redis-cli.exe,同理,可以双击执行也可以通过命令执行。

语法

Redis 客户端的基本语法为:

$ redis-cli

实例

以下实例讲解了如何启动 redis 客户端:

启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。

技术分享

在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。


在远程服务上执行命令

如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。

语法

$ redis-cli -h host -p port -a password

-h 服务器地址 -p 端口号 -a 密码

实例

以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 xxx的 redis 服务上。

技术分享

当然Redis默认是没有密码的,如果要设置密码可以去配置文件中设置,我这里只是随便输了个XXX,它也是能够访问的。

所以Redis的命令是在Redis的客户端执行的,它可以对服务器进行相应的操作。

以上是关于Redis 6.0多线程介绍的主要内容,如果未能解决你的问题,请参考以下文章

Redis 6.0 稳定版发布,支持多线程 IO

支持多线程的Redis 6.0终于发布了!

兄弟,Redis 6.0 除了多线程,别忘了这个牛逼特性!

老弟,Redis 6.0 除了多线程,别忘了这个牛逼特性!

Redis 6.0 多线程重磅发布!!!

Redis 6.0 多线程重磅发布!!!