Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注。
❝码老湿,提供了啥特性呀?知道了我能加薪么?
主要特性如下:
-
多线程处理网络 IO; -
客户端缓存; -
细粒度权限控制(ACL); -
RESP3
协议的使用; -
用于复制的 RDB 文件不在有用,将立刻被删除; -
RDB 文件加载速度更快;
其中备受关注的就是「多线程模型 + 客户端缓存」,我们只有掌握了新特性原理,才能判断什么时候使用 6.0 版本,如何用的更好更快,不踩坑。
本篇先从 Redis 多线程模型开始
-
使用 Redis 时,几乎不存在 CPU 成为瓶颈的情况, Redis 主要受限于内存和网络。 -
在一个普通的 Linux 系统上,Redis 通过使用 pipelining
每秒可以处理 100 万个请求,所以如果应用程序主要使用 O(N) 或O(log(N)) 的命令,它几乎不会占用太多 CPU。 -
使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。
read/write
系统调用占用了Redis 执行期间大部分CPU 时间,瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:
-
提高网络 IO 性能,典型的实现比如使用 DPDK
来替代内核网络栈的方式。 -
使用多线程充分利用多核,提高网络请求读写的并行度,典型的实现比如 Memcached
。
-
主线程负责接收建立连接请求,获取 socket
放入全局等待读处理队列; -
主线程通过轮询将可读 socket
分配给 IO 线程; -
主线程阻塞等待 IO 线程读取 socket
完成; -
主线程执行 IO 线程读取和解析出来的 Redis 请求命令; -
主线程阻塞等待 IO 线程将指令执行结果回写回 socket
完毕; -
主线程清空全局队列,等待客户端后续的请求。
redis.conf
配置文件:
io-threads-do-reads yes
。
io-threads 4
总结与思考
-
优化网络 I/O 模块 -
提高机器内存读写的速度
-
零拷贝技术或者 DPDK 技术 -
利用多核优势
Multi-Reactors/Master-Workers
模型。
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
本文分享自微信公众号 - Hollis(hollischuang)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。