Loading [MathJax]/jax/input/TeX/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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis:21---客户端相关配置篇
一、客户端相关配置 ①客户端的限制maxclients Redis提供了maxclients参数来限制最大客户端连接数,一旦连接数超过 maxclients,新的连接将被拒绝 maxclients默认
用户3479834
2021/02/03
1.8K0
Redis:21---客户端相关配置篇
Redis:22---客户端API:client、monitor)
一、client list client list命令能列出与Redis服务端相连的所有客户端连接信息。例如下面代码是在一个Redis实例上执行client list的结果,其中每一行代表一个客户端信
用户3479834
2021/02/03
8230
Redis:22---客户端API:client、monitor)
redis见解
http://blog.csdn.net/zhiguozhu/article/details/50517527 Redis 原生session与redis中的session区别 原生session在服务器上是以文件的形式存储的,所以其有一些磁盘io上的缺点
江湖前辈黄药师
2018/08/27
6830
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学习五(Redis 阻塞的原因及其排查方向).
因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况。
JMCui
2020/11/05
2.2K0
Redis学习五(Redis 阻塞的原因及其排查方向).
TIME_WAIT引起Cannot assign requested address报错
有时候用redis客户端(php或者java客户端)连接Redis服务器,报错:“Cannot assign requested address。”
黄规速
2022/04/14
2.1K0
linux安装redis+设置远程连接(史上最容易)
redis-server -v查看安装的redis版本。我安装的是3.0,这个版本就不错了,如果更新了数据源依然是2.8左右版本,我建议还是用下载压缩包的方式安装redis。
100000860378
2018/09/13
2.8K0
Redis使用及源码剖析-13.Redis客户端-2021-1-27
Redis服务端是典型的一对多程序,可以为多个客户端提供服务,Redis服务端结构体中的clients链表中保存了所有的客户端信息,如下所示:
用户7719114
2022/02/22
5930
Redis使用及源码剖析-13.Redis客户端-2021-1-27
《Redis设计与实现》读书笔记(十八) ——Redis客户端属性设计与原理
《Redis设计与实现》读书笔记(十八) ——Redis客户端属性设计与原理 (原创内容,转载请注明来源,谢谢) 一、概述 redis服务器是一对多服务器,多个客户端可以与一个服务器建立连接,并且分别发送请求,服务器接收请求并分别回复。通过使用I/O多路复用技术实现的文件事件处理器,redis服务器使用单线程单进程的方式来处理请求,并与多个客户端建立网络通信。 1、单个客户端状态结构存储 每个与服务器建立连接的客户端,服务器都为这些客户端建立相应的redis.h/redisClient结
用户1327360
2018/03/07
1.3K0
《Redis设计与实现》读书笔记(十八)  ——Redis客户端属性设计与原理
Redis客户端常见异常分析
在Redis客户端的使用过程中,无论是客户端使用不当或者Redis服务端出现问题,客户端会反应出一些异常,下面分析一下Jedis使用过程中常见的异常情况:
九州暮云
2019/08/21
3.8K0
Redis客户端常见异常分析
redis.conf翻译与配置(六)【redis6.0.6】
当散列有少量条目且最大条目不超过给定的阈值时,使用内存高效数据结构对其进行编码。可以使用以下指令配置这些阈值:
看、未来
2022/05/06
6920
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结 (原创内容,转载请注明来源,谢谢) 一、客户端的创建于关闭 1、普通客户端连接 普通的客户端,通过connect
用户1327360
2018/03/07
1.7K0
《Redis设计与实现》读书笔记(十九)  ——Redis客户端创建关闭及客户端总结
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
7560
redis配置文件
查看配置文件:https://raw.githubusercontent.com/antirez/redis/5.0.3/redis.conf
chenchenchen
2019/09/02
1.2K0
Redis配置文件详解
还记得我刚入行的时候,我的师傅就经常告诉我们配置比开发更重要,因为很多时候就是由于配置不当,而造成后期的难以预想的各种问题,以至于项目难以维护等等由于配置。进入一个公司首先的也是看相关项目的文档。so,如果需要对于redis有更深入的了解,与使用配置文件不可不读。为CURD,但不止于CURD。那么接下来我们对于redis.conf有个了解,话不多说,开干。
PayneWu
2021/01/25
2K0
Redis使用——Redis的redis.conf配置注释详解(四)
日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。
cn華少
2022/01/11
4850
redis全配置文件解析
🔍 本文将深入解析Redis的全配置文件,详细介绍核心配置项、日志相关配置、持久化配置(RDB和AOF)、主从同步相关配置以及慢查询相关配置,为读者提供全面的Redis配置信息。
默 语
2024/11/20
3530
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 Pub/Sub模式的数据安全?
最近遇到一个生产环境问题,排查了比较久,记录一下,方便以后反思。 业务场景:实现每天的考勤打卡提醒,根据配置的规则数据,比如每天提前几分钟,提醒员工打卡,所以会下班前几分钟推送消息到微信公众号,提醒员工,记得打卡考勤
SmileNicky
2024/12/23
1740
Redis技术(附软件分享)
第四步 编译 redis 命令:进入 redis 的解压完毕的根目录下 , 执行命令:
时间静止不是简史
2020/07/27
7410
Redis技术(附软件分享)
相关推荐
Redis:21---客户端相关配置篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档