Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >4R分析redis处理客户端请求

4R分析redis处理客户端请求

原创
作者头像
温安适
发布于 2022-07-19 11:26:11
发布于 2022-07-19 11:26:11
7710
举报
文章被收录于专栏:温安适的blog温安适的blog

Role

FD 套接字

EVENT; AcceptEvent ReadEvent WriteEvent

Handler AcceptHandler ReadHandler WriteHandler

buffer : queryBuffer ,replay,其他buffer

IO Multiplexer IO多路复用

Event Loop 事件轮询

Rank

不在深入,不在划分层次

Relation

Rule

连接规则

Redis 使用多路复用和非阻塞 I/O

设置TCP_NODELAY 选项是为了确保连接没有延迟

创建一个 可读文件事件。当sokect有新的可读数据时,触发事件,保证 Redis 能够立即收集客户端查询

检查是否达到最大客户端数量限制( maxclients),若已达到最大客户端数,redis会尝试向客户端发送错误信息并立即关闭连接

maxclients说明

Redis 2.6 +, redis.conf 中可以配置maxclients,默认10000,

最大客户端数 = min( maxclients+32,能够打开的文件描述符的最大数量)

32是redis预留的clients数量。

请求处理顺序

客户端套接字文件描述符编号,内核报告事件的顺序共同确定,因此该顺序 应视为未指定

当有2件事是确定的,

每次从客户端套接字,读取内容时,会调用read()方法,执行一次系统调用。

为了提高局部性,从客户端读取新数据时,会把当前缓冲区中所有查询都会按顺序处理

输出缓冲区限制replay

每个客户端一个可变长度的输出缓冲区,

防止客户端无法快速处理,造成输出缓冲区增长,消耗内存大量内存,默认情况下,Redis 会为不同类型的客户端设置输出缓冲区大小的限制。

当达到限制时,客户端连接关闭,事件记录在 Redis 日志文件中。

Redis 使用了两种限制:

  • 硬限制是一个固定限制,当达到该限制时,Redis 会尽快关闭客户端连接。
  • 软限制是取决于时间的限制,例如每 10 秒 32 M的软限制意味着如果客户端的输出缓冲区连续 10 秒大于 32 M,则连接将关闭。

不同类型的客户端有不同的默认限制:

  • 普通客户端的默认限制为 0,即没有限制,因为大多数普通客户端使用阻塞实现发送单个命令并在发送下一个命令之前等待完全读取回复.
  • Pub/Sub 客户端的默认硬限制为 32 M,软限制为每 60 秒 8 M。
  • 副本的默认硬限制为 256 M,软限制为每 60 秒 64 M。

2种设置输出缓冲区

运行时更改限制, CONFIG SET

redis.conf更改限制。

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 8mb 2mb 60

查询缓冲区硬限制

来自客户端的命令的缓冲区,达到1GB时将关闭连接。

只是避免服务器崩溃的极端限制,以防客户端或服务器软件错误。

client 驱逐策略

Redis 7.0+ 特性

这种机制称为 客户端驱逐,它本质上是一种安全机制,一旦所有客户端的总内存使用量超过阈值,它将断开客户端。

该机制首先尝试断开使用最多内存的客户端。

它断开返回低于 maxmemory-clients阈值所需的最小客户端数量。

maxmemory-clients定义连接到 Redis 的所有客户端的最大聚合内存使用量。

聚合考虑了客户端连接使用的所有内存:查询缓冲区、输出缓冲区和其他中间缓冲区。

副本和主连接不受客户端驱逐机制的影响。因此,此类连接永远不会被驱逐。

maxmemory-clients可以在配置文件 ( redis.conf) 中或通过 CONFIG SET命令永久设置。此设置可以是 0(表示无限制)、以字节为单位的大小(可能带有 mb/ gb后缀)或 maxmemory使用 %后缀的百分比(例如,将其设置为 10%表示 maxmemory配置的 10%)。

默认设置为 0,表示默认情况下关闭客户端驱逐。

大型生产环境,强烈建议配置一些非零 maxmemory-clients值。首次设置建议 5%,后续按需调整。

可以从客户端驱逐机制中排除的特定客户端连接

使用以下命令(来自相关客户端的连接)执行此操作:

CLIENT NO-EVICT on

你可以通过以下方式恢复它:

CLIENT NO-EVICT off

client 超时策略

默认情况下,如果客户端空闲了很多秒,Redis 的最新版本不会关闭与客户端的连接:连接将永远保持打开状态。

但是如果你不喜欢这种行为,你可以配置一个超时,这样如果客户端空闲超过指定的秒数,客户端连接将被关闭。

redis.conf中配置,或者CONFIG SET timeout 。

注意,超时仅适用于普通客户端, 不适用于 Pub/Sub 客户端,因为 Pub/Sub 连接是 推送式连接,因此空闲的客户端是常态。

设置超时的2个场景:

  • 关键任务应用程序,其中客户端软件中的错误可能会使 Redis 服务器因空闲连接而饱和,从而导致服务中断。
  • 作为一种调试机制,以便在客户端软件中的错误使服务器充满空闲连接时能够与服务器连接,从而无法与服务器交互。

超时不精确:当超时设置为 10 秒时,客户端连接可能会关闭,例如,如果同时连接了多个客户端,则会在 12 秒后关闭

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十四、装饰器模式 ( Decorator Pattern )
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构
botkenni
2022/09/07
2740
十四、装饰器模式 ( Decorator Pattern )
dart设计模式之装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
徐建国
2021/08/07
6870
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
在 Java 中,装饰模式通过动态地将责任附加到对象上,以扩展其功能,它提供了一种比继承更灵活的方式来扩展对象的功能。
Designer 小郑
2023/09/15
6380
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
面试官:代理模式和装饰器模式的区别
代理模式和装饰器模式是两种不同的设计模式,虽然它们有一些共同的特点,但是在使用方式和实现上有一些区别。
田维常
2024/04/17
4850
面试官:代理模式和装饰器模式的区别
装饰器模式:让你的对象变得更强大
在日常开发中,当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。这时候,我们该怎么办呢?我们可以使用装饰器器模式来解决这个问题,本文将从以下四个方面讲解装饰器器模式。
wayn
2023/09/06
1980
装饰器模式:让你的对象变得更强大
装饰器模式
// Decorateor Pattern // 向一个现有的对象添加新的功能,同时又不改变其结构(方法签名不变)。 // 可动态的给一个对象添加一些额外的职责。比继承创建子类更灵活。 // // Step1: 创建一个接口 public interface Shape { void draw(); } // step2: 创建实现接口的实体类 Rectangle.cs Circle.cs public class Rectangle : Shape { public void draw
用户2434869
2018/09/12
5450
架构思想--基础架构
  最近研究一些架构思想,看看李云华老师的专栏(从0开始学架构),做些笔记有些个人的思考。
Dlimeng
2023/06/29
2510
架构思想--基础架构
java设计模式
java中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。
EdwinYang
2023/10/16
3130
Java设计模式(7)装饰器模式
装饰器模式是一种结构型设计模式,用于动态地为对象添加额外的行为或责任,而无需修改其原始类。它允许将对象包装在一系列装饰器中,每个装饰器都添加一些特定的功能,从而实现对对象行为的灵活扩展。
Jensen_97
2024/04/18
1950
Java设计模式(7)装饰器模式
Java设计模式学习笔记—桥接模式
文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Bridge包(package)中。
WindCoder
2018/09/20
5970
Java设计模式学习笔记—桥接模式
架构设计&分布式&数据结构与算法面试题(2020最新版)「建议收藏」
Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…
全栈程序员站长
2022/09/02
3460
架构设计&分布式&数据结构与算法面试题(2020最新版)「建议收藏」
C#设计模式19——装饰器模式的写法
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。
明志德道
2023/10/21
3470
一文总结设计模式
举例:就比如一个网络请求框架大体分为:请求类,缓存类,配置类,不能把这3个混在一起,必须分为3个类去实现不同的功能。
小呆呆666
2020/12/28
5710
一文总结设计模式
Java设计模式学习笔记—抽象工厂模式
文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其AbstractFactory包(package)中。
WindCoder
2018/09/20
4160
Java设计模式学习笔记—抽象工厂模式
【详解】JAVA设计模式桥接模式(Bridge)
在面向对象的设计中,设计模式是一种在特定情况下解决设计问题的通用可重用方案。本文将介绍一种结构型设计模式——桥接模式(Bridge Pattern)。桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。
大盘鸡拌面
2025/03/14
770
Java设计模式学习笔记—原型模式
文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Prototype包(package)中。
WindCoder
2018/09/20
4030
Java设计模式学习笔记—原型模式
Java设计模式学习笔记—工厂模式
想学习设计模式很久了,趁现在有时间边学习边记录一下。目前设计模式学习主要基于菜鸟教程的设计模式,后期不排除会追加从其他地方学来内容。
WindCoder
2018/09/20
3580
Java设计模式学习笔记—工厂模式
Java设计模式之原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许对象在创建时通过复制一个现有对象的实例来进行。该模式的主要目的是通过克隆(复制)现有对象来创建新对象,从而避免了直接使用构造函数创建新对象的复杂性。原型模式通常涉及一个抽象的原型类,该类声明了一个克隆方法,具体的子类实现该方法以创建新对象。
刺槐儿
2024/01/21
2740
设计模式-享元模式示例
在这里,我们使用HashMap来维护已经存在的对象,如果客户端请求一个新的对象,那么我们先检查HashMap中是否已经有相应的对象,如果有,则直接返回已经存在的对象;如果没有,则创建一个新的对象,并将其添加到HashMap中。
堕落飞鸟
2023/05/04
1510
初探Java设计模式2:结构型模式(代理模式,适配器模式等)
转自https://javadoop.com/post/design-pattern
Java技术江湖
2019/11/19
3100
相关推荐
十四、装饰器模式 ( Decorator Pattern )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档