redis是多线程也是多线程,原因如下:
在Redis4.0之前,Redis是单线程运行的,但是单线程并不代表效率就低,像Nginx、Nodejs也是单线程程序,但是它们的效率并不低。
原因就是Redis是基于内存操作的,它的瓶颈在于机器的内存、网络带宽,而不是CPU,在你CPU还没达到瓶颈时你的内存可能就先满了、或者带宽达到瓶颈了。因此CPU不是主要原因,那么自然就采用单线程了,况且使用多线程比较麻烦。
但是在Redis 4.0的时候,已经开始支持多线程了,Redis在4.0以及之后的版本中引入了惰性删除(也叫异步删除),意思就是我们可以使用异步的方式对Redis中的数据进行删除操作了,例如:unlink key、flushdb async、flushall async,举个例子:
127.0.0.1:6379> set name hanser
OK
127.0.0.1:6379> get name
"hanser"
127.0.0.1:6379> unlink name # 这里是异步删除一个key,同步的话则是del name
(integer) 1
127.0.0.1:6379> flushdb async
OK
127.0.0.1:6379> flushall async
OK
这样处理的好处就是不会使Redis的主线程卡顿,会把这些删除操作交给后台线程来执行。
通常情况下使用 del 指令可以很快的删除数据,但是当被删除的 key 是一个非常大的对象时,例如:删除的是包含了成千上万个元素的 hash 集合时,那么 del 指令就会造成 Redis 主线程卡顿,因此使用惰性删除可以有效的避免 Redis 卡顿的问题。在Redis6.0中新增了多线程的功能来提高I/O的读写性能,它的主要实现思路是将主线程的I/O读写任务拆分给一组独立的线程去执行,这样就可以使多个socket的读写并行化了,但Redis的命令依旧是由主线程串行执行的。
但是注意:Redis6.0是默认禁用多线程的,但可以通过配置文件redis.conf中的io-threads-do-reads等于true来开启,完整配置为io-threads-do-reads true。但是还不够,除此之外我们还需要设置线程的数量才能正确地开启多线程的功能,同样是修改Redis的配置,例如设置io-threads 4,表示开启4个线程。关于线程数的设置,官方的建议是如果为4核的CPU,那么设置线程数为2或3;如果为8核的CPU,那么设置线程数为6。总之线程数一定要小于机器的CPU核数,线程数并不是越大越好。
网友回复
python如何调用openai的api实现知识讲解类动画讲解视频的合成?
html如何直接调用openai的api实现海报可视化设计及文本描述生成可编辑海报?
f12前端调试如何找出按钮点击事件触发的那段代码进行调试?
abcjs如何将曲谱播放后导出mid和wav格式音频下载?
python如何将曲子文本生成音乐mp3或wav、mid文件
python中mp3、wav音乐如何转成mid格式?
js在HTML中如何将曲谱生成音乐在线播放并下载本地?
python如何实现在windows上通过键盘来模拟鼠标操作?
python如何给win10电脑增加文件或文件夹右键自定义菜单?
python如何将音乐mp3文件解析获取曲调数据?