Redis通常被称为单进程单线程模型。

这不是真的!

Redis还运行多个后端线程来执行后端清理工作,例如清理脏数据和关闭文件描述符。在Redis中,主线程负责主要任务,包括但不限于:接收来自客户端的连接,处理连接读/写事件,解析请求,处理命令,处理定时器事件和同步数据。只有一个CPU核心运行单个进程和单个线程。

对于小数据包,Redis服务器可以处理80,000到100,000 QPS。更大的QPS超出了Redis服务器的处理能力。常见的解决方案是在分布式架构中对数据进行分区并采用多个服务器。

然而,该解决方案也具有许多缺点。例如,要管理的Redis服务器太多; 某些适用于单个Redis服务器的命令不适用于数据分区; 数据分区无法解决热点读/写问题; 数据偏斜,重新分配和放大/缩小变得更加复杂。由于单进程和单线程的限制,我们希望可以重构多线程以充分利用SMP多核架构的优势,从而提高单个Redis服务器的吞吐量。

要使Redis成为多线程,最简单的思考方式是每个线程都执行I / O和命令处理。但是,由于Redis处理的数据结构很复杂,多线程需要使用锁来确保线程安全。锁定粒度的不正确处理可能会降低性能。

我们建议增加I / O线程的数量,以使独立的I / O线程能够读取/写入连接,解析命令和回复数据包中的数据,并且仍让单个线程处理命令并执行计时器事件。这样,可以增加单个Redis服务器的吞吐量。

单进程和单线程模型

好处

  1. 由于单进程和单线程模型的限制,耗时的操作(例如dict rehash和过期的密钥删除)被分解为多个步骤并在Redis实现中逐个执行。这防止了操作长时间执行,因此避免了操作对系统的长时间阻塞。单进程和单线程代码易于编译,这减少了由多进程和多线程引起的上下文切换和锁定占用。

缺点

  1. 只能使用一个CPU内核,无法利用多核优势。

  2. 对于繁重的I / O应用程序,网络I / O操作会消耗大量CPU容量。使用Redis作为缓存的应用程序通常是繁重的I / O应用程序。这些应用程序基本上具有高QPS,使用相对简单的命令(例如get,set和incr),但是对RT敏感。它们通常具有高带宽使用率,甚至可能达到数百兆比特。由于10 GB和25 GB网络适配器的普及,网络带宽不再是瓶颈。因此,我们需要考虑的是如何利用多核的优势和网络适配器的性能。

多线程模型与实现

线程模型

有三种线程类型,即:

  1. 主线程

  2. I / O线程

  3. 工人线程

    1. 主线程:接收连接,创建客户端,并转发到I / O线程的连接。

    2. I / O线程:处理连接读/写事件,解析命令,将完整解析的命令转发到工作线程进行处理,发送响应数据包并删除连接。

    3. 工作线程:处理命令,生成客户端响应数据包,并执行计时器事件。

    4. 主线程,I / O线程和工作线程分别由事件驱动。

    5. 线程通过无锁队列交换数据,并通过隧道发送通知。

    多线程模型的好处

    提高读/写性能

    压力测试结果表明,在小数据包场景中,读/写性能可提高约三倍。


  4. 提高主/从同步速度

    当主设备将同步数据发送到从设备时,数据将在I / O线程中发送。从主站读取数据时,从站从工作线程读取完整数据,从I / O线程读取增量数据。这可以有效地提高同步速度。

    后续任务

    第一项任务是增加I / O线程数并优化I / O读/写功能。接下来,我们可以分解工作线程,以便每个线程完成I / O读取,以及工作线程的工作。

    设置I / O线程数

    1. 测试结果表明I / O线程的数量不应超过6.否则,工作线程将成为简单操作的瓶颈。

    2. 在启动进程时,必须设置I / O线程的数量。进程运行时,无法修改I / O线程数。根据当前的连接分配策略,修改I / O线程的数量涉及重新分配连接,这非常复杂。

    注意事项

    1. 随着10 GB和25 GB网络适配器的普及,必须仔细考虑如何充分利用硬件性能。我们可以使用技术,例如用于networkI / O的多线程和内核绕过用户模式协议栈。

    2. I / O线程可用于实现无阻塞数据迁移。I / O线程对数据进程进行编码或转发命令,而目标节点对数据进行解码或执行命令。

    ————————————————————

    推荐阅读:

    老王讲架构:负载均衡

    支付宝系统架构内部剖析

    大数据Spark与Storm技术选型

    【赞】用Python实现Zabbix-API 监控

    程序员怎么留住健康?

    大数据智慧平台技术方案

    大数据聚合平台解决方案

通过多线程处理提高Redis性能的更多相关文章

  1. Redis性能问题排查解决手册(七)

     阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...

  2. Redis性能问题排查解决手册

    转自:http://www.cnblogs.com/mushroom/p/4738170.html 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_comma ...

  3. 关于redis性能问题分析和优化

    一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...

  4. Redis(二十一):Redis性能问题排查解决手册(转)

    性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...

  5. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...

  6. Redis为什么变慢了?透彻解读如何排查Redis性能问题

    Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符. 你也 ...

  7. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  8. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  9. Redis性能调优

    Redis性能调优 尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题.前文中提到过,Redis采用单线程模型,所有的命令都是由一个线程串行执行的,所以当某个命令执行 ...

随机推荐

  1. Html元素添加事件禁用

    最近几天,测试在检测我页面功能时,疯狂点击带接口请求的按钮,然后就会发起无数次请求,然后app就卡住了.当看到这个问题的时候,心里疯狂鄙视测试(开个玩笑),一开始想的到解决方案是用函数防抖,使用函数防 ...

  2. jieba库的使用与词频统计

    1.词频统计 (1)词频分析是对文章中重要词汇出现的次数进行统计与分析,是文本 挖掘的重要手段.它是文献计量学中传统的和具有代表性的一种内容分析方法,基本原理是通过词出现频次多少的变化,来确定热点及其 ...

  3. k8s probe

    livenessProbe: httpGet: path: /abc/401 port: 8384 scheme: HTTP

  4. vue1.0与vue2.0对于v-for的使用的区别

    vue1.0与vue2.0对于v-for的使用的区别: 1,vue1.0中有$index,而vue2.0将$index移除. 2,vue1.0中(index,item) in list 而vue2.变 ...

  5. [Swift]LeetCode219. 存在重复元素 II | Contains Duplicate II

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...

  6. [Swift]LeetCode717. 1比特与2比特字符 | 1-bit and 2-bit Characters

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  7. [Swift]LeetCode746. 使用最小花费爬楼梯 | Min Cost Climbing Stairs

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  8. [Swift]LeetCode795. 区间子数组个数 | Number of Subarrays with Bounded Maximum

    We are given an array A of positive integers, and two positive integers L and R (L <= R). Return ...

  9. setData方法修改data中对象或数组的属性值(小程序开发)

    今日在开发小程序地图的过程中,遇到一个问题,困扰了我一会 业务如下: 困扰点: 我不知道如何修改data中数组包含的对象是如何修改的:期初的想法还是想共享上面的数据,想的太简单了 正确的解决步骤: 直 ...

  10. win10安装ubuntu16.04及后续配置

    原文地址:https://www.jianshu.com/p/842e36a8255c UEFI 模式下win10安装ubuntu16.04双系统教程 - baobei0112的专栏 - CSDN博客 ...