2024-05-02  阅读(3)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1495011036

Redis 的性能瓶颈从来都不是 CPU,是网络I/O 和内存。

内存好解决,加机器内存和优化数据结构。

网路 I/O 的优化才是大头,因为读写网络的 read/write 系统调用占用了Redis执行期间大部分CPU时间,如果能够将这部分多线程化,则会大大提高 Redis 的性能。

故而,Redis 6.0 引入 I/O 多线程模型,但是它只对网络的部分采用了多线程,数据的读写依然是单线程。

总结就是:将主线程 IO 读写任务拆分出来给一组独立的线程处理,使得多个 socket 读写可以并行化,但是 Redis 命令还是主线程串行执行。

扩展

根据测算,Redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,对于小数据包,Redis 服务器可以处理 80,000 到 100,000 QPS,这么高的对于 80% 的公司来说,单线程的 Redis 已经足够使用了。

但是,随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的 QPS。经过分析 Redis 的性能瓶颈主要体现在网络 IO 的处理上。所以 Redis 引入多线程来优化网络 I/O 的处理。

客户端发送一条请求给 Redis 后,Redis 的处理过程分为四个步骤:读取请求、解析请求、数据读写、响应写回,在 Redis 6.0 之前这个过程统一由主线程处理,Redis 6.0 多线程后,处理过程如下:

所以,Redis 6.0 引入的多线程只⽤来处理处理网络数据的读写和协议解析,而数据读写依然采用由主线程来处理,主要原因大明哥认为有如下几个:

  1. 数据读写为纯内存操作,速度极快,不是性能瓶颈所在。
  2. 如果使用多线程来处理数据读写,则需要多线程的数据安全机制,使得模型变得更加复杂,难以维护。
  3. 多线程带来的资源竞争和上下文切换的消耗会得不偿失。

Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文