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

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

原创
作者头像
温安适
发布于 2022-07-19 11:26:11
发布于 2022-07-19 11:26:11
7790
举报
文章被收录于专栏:温安适的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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis 配置文件redis.conf 示例详解
# 注意单位: 当需要配置内存大小时, 可能需要指定像1k,5GB,4M等常见格式 # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # 单位是对大小写不敏感的 1GB 1Gb 1gB 是相同的。
星哥玩云
2022/08/18
7700
Redis客户端常见异常分析
在Redis客户端的使用过程中,无论是客户端使用不当或者Redis服务端出现问题,客户端会反应出一些异常,下面分析一下Jedis使用过程中常见的异常情况:
九州暮云
2019/08/21
3.9K0
Redis客户端常见异常分析
【云原生进阶之PaaS中间件】第一章Redis-1.3Redis配置
        Redis支持采用其内置默认配置的方式来进行启动,而不需要提前配置任何文件,但是这种启动方式只推荐在测试和开发环境中使用,但更好的方式是通过提供一个Redis的配置文件来对Redis进行配置, 这个配置文件一般命名为’redis.conf’。
江中散人_Jun
2023/10/16
3480
【云原生进阶之PaaS中间件】第一章Redis-1.3Redis配置
Redis:21---客户端相关配置篇
一、客户端相关配置 ①客户端的限制maxclients Redis提供了maxclients参数来限制最大客户端连接数,一旦连接数超过 maxclients,新的连接将被拒绝 maxclients默认
用户3479834
2021/02/03
1.9K0
Redis:21---客户端相关配置篇
Redis错误配置详解
Redis提供了许多提高和维护高效内存数据库使用的工具。在无需额外配置应用层的前提下,Redis独特的数据类型、指令和命令调优就可以满足应用的需求,但是错误的配置,更确切的说那些机外设备可能导致操作麻烦和性能问题。虽然导致了一些令人头疼的问题,但是解决方案是存在的,而且解决方案可能比我们预期的简单。 本系列文章介绍了使用Redis时遇到的一些令人头疼的问题,以及该解决这些问题。这些内容基于我们在运行上千个Redis数据库实例时的真实经历。 复制缓冲区限制 复制缓冲区主从服务器同步数据时保存数据的内存区域。在
CSDN技术头条
2018/02/07
9660
redis全配置文件解析
🔍 本文将深入解析Redis的全配置文件,详细介绍核心配置项、日志相关配置、持久化配置(RDB和AOF)、主从同步相关配置以及慢查询相关配置,为读者提供全面的Redis配置信息。
默 语
2024/11/20
4160
Redis:22---客户端API:client、monitor)
一、client list client list命令能列出与Redis服务端相连的所有客户端连接信息。例如下面代码是在一个Redis实例上执行client list的结果,其中每一行代表一个客户端信
用户3479834
2021/02/03
8370
Redis:22---客户端API:client、monitor)
linux安装redis+设置远程连接(史上最容易)
redis-server -v查看安装的redis版本。我安装的是3.0,这个版本就不错了,如果更新了数据源依然是2.8左右版本,我建议还是用下载压缩包的方式安装redis。
100000860378
2018/09/13
2.8K0
Redis(2.8版本)配置文件参数中文详解
#daemonize no 默认情况下, redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes daemonize yes # 当 redis 在后台运行的时候, Redis 默认会把 pid 文件放在 /var/run/redis.pid ,你可以配置到其他地址。 # 当运行多个 redis 服务时,需要指定不同的 pid 文件和端口 pidfile /var/run/redis_6379.pid # 指定 redis 运行的端口,默认是 6379 port 6379 #
小小科
2018/05/02
1.2K0
redis见解
http://blog.csdn.net/zhiguozhu/article/details/50517527 Redis 原生session与redis中的session区别 原生session在服务器上是以文件的形式存储的,所以其有一些磁盘io上的缺点
江湖前辈黄药师
2018/08/27
6900
redis配置文件
查看配置文件:https://raw.githubusercontent.com/antirez/redis/5.0.3/redis.conf
chenchenchen
2019/09/02
1.2K0
CentOS6 脚本自动安装redis sentinel
shaonbean
2018/01/02
1K0
TIME_WAIT引起Cannot assign requested address报错
有时候用redis客户端(php或者java客户端)连接Redis服务器,报错:“Cannot assign requested address。”
黄规速
2022/04/14
2.1K0
redis.conf翻译与配置(六)【redis6.0.6】
当散列有少量条目且最大条目不超过给定的阈值时,使用内存高效数据结构对其进行编码。可以使用以下指令配置这些阈值:
看、未来
2022/05/06
7030
Redis使用——Redis的redis.conf配置注释详解(四)
日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。
cn華少
2022/01/11
5000
Redis学习五(Redis 阻塞的原因及其排查方向).
因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况。
JMCui
2020/11/05
2.3K0
Redis学习五(Redis 阻塞的原因及其排查方向).
redis配置详解(中英文)
V2.8.21: (中英字幕同步) # Redis configuration file example #* Redis 配置文件例子 # Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes #
三丰SanFeng
2018/01/16
1.4K0
深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客户端)「建议收藏」
Redis 数据库采用 I/O 多路复用技术实现文件事件处理器,服务器采用单线程单进程的方式来处理多个客户端发送过来的命令请求,它同时与多个客户端建立网络通信。服务器会为与它相连接的客户端创建相应的 redis.h/redisClient 结构,在这个结构中保存了当前客户端的相关属性及执行相关功能时的数据结构。
全栈程序员站长
2022/06/28
1.9K0
深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客户端)「建议收藏」
Redis技术(附软件分享)
第四步 编译 redis 命令:进入 redis 的解压完毕的根目录下 , 执行命令:
时间静止不是简史
2020/07/27
7540
Redis技术(附软件分享)
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结 (原创内容,转载请注明来源,谢谢) 一、客户端的创建于关闭 1、普通客户端连接 普通的客户端,通过connect
用户1327360
2018/03/07
1.7K0
《Redis设计与实现》读书笔记(十九)  ——Redis客户端创建关闭及客户端总结
相关推荐
Redis 配置文件redis.conf 示例详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档