目录

一、Redis 客户端:银行的 “客户档案”

二、客户端关闭:银行的 “终止服务规则”

三、命令处理流程:柜员办理业务的 “标准步骤”

1. 接收申请单(读取命令请求)

2. 确认业务类型(查找命令)

3. 检查业务合法性(预备操作)

4. 办理业务(调用命令实现函数)

5. 收尾工作(执行后续工作)

6. 给客户回执(发送命令回复)

四、serverCron 函数:大堂经理的 “定期巡检”

五、服务器初始化:银行的 “开业准备流程”

六、总结:银行系统与 Redis 的对应逻辑


如果把 Redis 服务器比作一家高效运转的银行,那么客户端就是 “来办理业务的客户”,服务器的命令处理流程就是 “柜员办理业务的标准步骤”,而serverCron函数则是 “大堂经理的定期巡检”。我们用银行的场景来拆解这整套系统:

一、Redis 客户端:银行的 “客户档案”

每个来银行办理业务的客户,银行都会建立一份 “客户档案(redisClient结构体)”,记录客户的关键信息:

redisClient属性银行场景类比作用
name客户昵称(可选,默认无)CLIENT SETNAME给客户贴个标签,方便识别
fd客户的 “业务窗口编号”普通客户(网络连接)有编号(>0),内部模拟客户(伪客户端)无编号(-1)
flags客户身份标识(如 “VIP”“理财客户”)标记客户端角色(如从服务器、未完成同步的从节点等)
querybuf客户填写的 “业务申请单缓冲区”临时存放客户发送的命令请求(未解析前)
argv/argc申请单上的 “业务详情” 和 “参数数量”解析后的命令参数(如SET msg "hello"拆成argv = [SET, msg, "hello"]argc=3
buf/bufpos柜员给客户的 “回执单缓冲区”存放命令回复内容,bufpos记录已写长度
authenticated客户 “身份验证状态”0 = 未实名,1 = 已实名(未验证不能办业务)
ctime/lastinteraction客户 “开户时间” 和 “最后办理业务时间”用于判断客户是否 “休眠”(超时未操作)
obuf_soft_limit_reached_time客户 “取号排队超时起点”记录输出缓冲区首次超过软限制的时间,用于判断是否强制终止服务

二、客户端关闭:银行的 “终止服务规则”

银行会在以下情况拒绝为客户服务(关闭客户端):

  • 客户离场:客户主动离开(进程退出),窗口自动关闭(fd连接断开)。
  • 填错单据:客户提交的申请单格式错误(命令不符合协议),柜员拒收并请客户离开。
  • 被管理员清退:大堂经理(CLIENT KILL命令)强制请走某些客户。
  • 长时间不办业务:客户取号后超时未操作(超过timeout配置),视为放弃服务。
  • 申请单太大:客户的业务申请单超过最大尺寸(输入缓冲区 > 1GB),柜员无法处理。
  • 回执单太多拿不下:给客户的回执单超过限制(输出缓冲区超限):
    • 硬限制:回执单堆成山(超硬限制),直接请客户离开。
    • 软限制:回执单较多(超软限制),但客户还在等,记录开始等待时间;若超时仍未取走,强制请离。

三、命令处理流程:柜员办理业务的 “标准步骤”

客户到窗口递申请单(发送命令),柜员按以下步骤处理,对应 Redis 的命令执行流程:

1. 接收申请单(读取命令请求)

  • 客户把填好的申请单(命令)递进窗口,柜员先临时放在 “待处理文件夹(querybuf输入缓冲区)”。
  • 柜员解析申请单,提取 “业务类型” 和 “参数”(如 “存款 100 元” 拆成argv = [存款, 100]argc=2),写入客户档案。

2. 确认业务类型(查找命令)

  • 柜员查 “业务手册(命令表command table)”,根据申请单的 “业务类型”(argv[0])找到对应的办理流程(redisCommand结构,包含实现函数)。

3. 检查业务合法性(预备操作)

  • 柜员先做一系列检查,确保业务能正常办理:
    • 业务类型是否存在(cmd是否为NULL)?
    • 参数数量是否正确(如 “转账” 需要收款人、金额,缺一不可)?
    • 银行现金是否充足(maxmemory限制,内存不足可能拒绝写命令)?
    • 银行是否在维护(如数据载入中,只允许少数查询业务)?
    • 客户是否在特殊状态(如正在订阅理财产品,只能办相关业务)?
    • 若有监控(MONITOR),需同步记录业务详情给监控员。

4. 办理业务(调用命令实现函数)

  • 按业务手册的流程办理(执行命令函数),比如 “存款” 就修改客户账户余额(更新 Redis 数据库)。

5. 收尾工作(执行后续工作)

  • 若业务耗时太长(慢查询),记录到 “慢业务日志”。
  • 更新该业务的 “办理次数” 和 “平均耗时”(callsmilliseconds属性)。
  • 把业务详情记到 “银行流水(AOF 缓冲区)”,同步给 “总行备份(从服务器)”。

6. 给客户回执(发送命令回复)

  • 柜员把办理结果写在 “回执单(输出缓冲区)”,等客户窗口空闲(套接字可写)时,把回执递给客户。

四、serverCron 函数:大堂经理的 “定期巡检”

银行大堂经理每 100 毫秒巡视一次(serverCron默认频率),处理日常维护,确保银行正常运转:

  1. 校准时钟:同步墙上的 “电子钟(unixtime秒级时间)” 和 “毫秒表(mstime)”,减少频繁看表(系统调用)的开销。
  2. 更新物品存放时间:每 10 秒更新一次 “储物柜最后使用时钟(lruclock)”,用于判断哪些物品长期无人取(LRU 内存回收)。
  3. 统计业务量:每 100 毫秒抽样统计 “每秒办理业务数”,估算银行繁忙程度。
  4. 记录最大客流量:若当前客户数创纪录,更新 “最高客流量(stat_peak_memory)”。
  5. 处理停业通知:若收到 “停业指令(SIGTERM信号)”,标记 “准备关门(shutdown_asap)”,下次巡视时执行关门。
  6. 维护客户秩序
    • 清退 “超时未办业务的客户”(检查lastinteraction,超过timeout则关闭客户端)。
    • 清理客户的 “废弃申请单”(输入缓冲区过大时重置,释放内存)。
  7. 安排备份工作:若 “流水账重写(BGREWRITEAOF)” 因 “账本快照(BGSAVE)” 排队,现在轮到它执行了。
  8. 检查备份进度:看看 “账本快照员(rdb_child_pid)” 和 “流水账重写员(aof_child_pid)” 是否在工作,是否完成。
  9. 同步流水账:把 “临时流水缓冲区(AOF 缓冲区)” 的内容写到 “正式流水册(AOF 文件)”。
  10. 清退取单超时客户:把 “回执单拿太久(输出缓冲区超限)” 的客户请离。
  11. 记录巡视次数:每次巡视后,“巡视计数器(cronloops)” 加 1,用于一些定时任务触发。

五、服务器初始化:银行的 “开业准备流程”

Redis 服务器从启动到接待客户,像银行开业前的准备:

  1. 布置场地(初始化服务器状态)

    • 设定 “银行编号(runid)”、“营业时间(默认配置)”、“业务窗口数量(端口)” 等基础信息(initServerConfig函数)。
    • 准备 “业务手册(命令表)”,把所有可办理的业务(SETGET等)录入。
  2. 加载个性化配置(载入配置选项)

    • 根据 “上级指示(命令行参数)” 和 “银行规章(配置文件)”,调整营业时间、窗口数量等(覆盖默认配置)。
  3. 准备设备(初始化数据结构)

    • 摆好 “客户排队表(server.clients链表)”、“账户档案柜(server.db数组)”。
    • 准备 “理财产品订阅簿(pubsub_channels字典)”、“慢业务记录本(slowlog)” 等。
  4. 恢复账目(还原数据库状态)

    • 开业前,根据 “纸质账本(RDB 文件)” 或 “历史流水(AOF 文件)”,把所有客户账户余额恢复到上次关门时的状态。

六、总结:银行系统与 Redis 的对应逻辑

整个 Redis 客户端与服务器的交互,就像银行的 “客户 - 柜员 - 大堂经理” 体系:

  • 客户端是 “客户”,带着命令请求来办理业务,有自己的档案信息。
  • 命令处理流程是 “柜员的标准化服务步骤”,从接收到反馈环环相扣。
  • serverCron是 “大堂经理的巡检”,确保银行资源合理分配、系统稳定运行。
  • 初始化过程是 “开业准备”,从场地布置到账目恢复,为服务客户做足准备。

这种设计让 Redis 既能高效处理 “客户业务(命令)”,又能通过 “巡检” 维持系统稳定,就像一家流程规范、运转高效的银行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95683.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95683.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95683.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML图片标签及路径详解

图片是网页内容的重要组成部分&#xff0c;能够使页面更加生动直观。在HTML中&#xff0c;使用<img>标签插入图片&#xff0c;而正确设置图片路径则是确保图片能够正常显示的关键。一、图片标签&#xff08;<img>&#xff09;1. 图片标签的基本语法<img>标签…

【数据库通过日志恢复数据解读】

在数据库恢复机制中&#xff0c;日志文件是实现事务原子性、持久性和崩溃恢复的核心组件。以下通过具体示例和解读方法&#xff0c;结合主流数据库系统的实现细节&#xff0c;详细说明日志文件的内容与分析逻辑。 一、日志文件的核心作用与结构 日志文件通过**预写式日志&#…

【面试题】搜索准确性不高你怎么排查?

系统性排查框架&#xff1a;数据层检查 索引覆盖率&#xff1a;检查文档是否全部正确索引数据新鲜度&#xff1a;确认索引更新频率和延迟文档质量&#xff1a;分析被索引内容的质量和完整性查询理解层 分词分析&#xff1a;检查查询分词是否正确意图识别&#xff1a;验证意图分…

当AI开始“偷吃”用户数据并拼装功能模块:初级开发者的脑洞保卫战与老码农的灵魂蘸料

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录当AI开…

Flowable——流程定义与部署(RepositoryService)

文章目录 前言 参考资料 流程图的部署、查询与删除 流程图的准备 流程的部署 指定已部署流程信息查询 删除指定已部署流程 结语 前言 前篇博客具体说了怎么使用flowable去自动建表,以及搭建配置前端UI绘图的界面。本篇博客主要说明对于已绘制好的流程图如何去进行部署。 Flow…

采用基于模型的方法实现车辆SOA威胁分析自动化

摘要尽管采用面向服务架构&#xff08;SOA&#xff09;有助于实现自动驾驶、空中下载更新等功能&#xff0c;但同时也增加了车辆遭受攻击的风险&#xff0c;可能对道路使用者造成伤害。为解决这一问题&#xff0c;相关标准&#xff08;ISO 21434 / 联合国欧洲经济委员会&#x…

C++语言编程规范-常量

01 C还有搞头吗 02 常量 不变的值更易于理解、跟踪和分析&#xff0c;所以应该尽可能地使用常量代替变量&#xff0c;定义值的时候&#xff0c;应该把 const 作为默认的选项。使用 const 常量取代宏说明&#xff1a;宏是简单的文本替换&#xff0c;在预处理阶段时完成&#x…

【CS32L015C8T6】配置单片机PWM输出(内附完整代码及注释)

目录 前言&#xff1a; 一、CS32L015中定时器及PWM硬件资源介绍&#xff1a; 二、以CS32L015为例配置PWM步骤&#xff1a; 三、完整代码及注释 四、如果这篇文章能帮助到你&#xff0c;请点个赞鼓励一下吧ξ( ✿&#xff1e;◡❛)~ 前言&#xff1a; CS32L015 是一款内嵌 …

hive表不显示列注释column comment的问题解决

安装datasophon平台hive后&#xff0c;发现hive表的字段注释丢失了&#xff0c;表的注释没问题&#xff0c;csv格式的表没问题&#xff0c;只有parquet和orc的表有这个问题。查网上似乎没有这方面的问题。查看mysql表里面的中文注释也一切正常&#xff0c;后来经过多次研究才发…

【笔记】AI Agent发展趋势

前言 本章主要探讨了现在AI技术的发展趋势、大模型的一些局限性和小模型存在的必要性,然后引出了AI Agent的优势与发展趋势。 目标 学完本课程后,您将能够: 了解大模型的局限性; 了解小模型存在的必要性; 了解AI Agent的优势; 了解模型协同的技术。 目录 1.AI发…

ChatDOC工具测评:AI驱动PDF/Word文档处理,支持敏感内容隐私保护与表格提取分析

之前跟你们聊过用 Python 处理数据的 Pandas&#xff0c;今天换个更贴近日常办公的方向 —— 给你们安利一个 AI 文档处理工具「ChatDOC」&#xff0c;官网地址是https://www.chatdoc.com/&#xff0c;它能直接读取 PDF、Word 里的内容&#xff0c;你不用逐页翻文档找信息&…

Vue + fetchEventSource 使用 AbortController 遇到的“只能中止一次”问题解析与解决方案

前言 在前端项目中&#xff0c;使用 SSE&#xff08;Server-Sent Events&#xff09; 长连接去获取实时消息已经很常见了。像 fetchEventSource 这种封装好的工具&#xff0c;可以帮助我们轻松处理流式请求。 不过在实践中&#xff0c;我遇到了一个奇怪的问题&#xff1a;点击按…

Django get_or_create 方法详解

get_or_create 是 Django ORM 中的一个非常常用的方法&#xff0c;它用于获取数据库中的一个对象&#xff0c;如果该对象不存在&#xff0c;则创建一个新的对象并返回。 方法签名&#xff1a; Model.objects.get_or_create(defaultsNone, **kwargs)参数解释&#xff1a; defaul…

LangChain 文档问答系统中高级文本分割技术

告别语义断裂:LangChain 文档问答系统中高级文本分割技术深度指南 文章目录 引言:问题的根源——为何精准的文本分割是 RAG 系统的命脉? 第一部分:探本溯源——剖析 LangChain 默认分割器的“机械之困” 机制解析:语法驱动的“暴力”切分 问题场景化展示:语义、上下文与结…

Web2 vs Web3--差异一看就懂

互联网技术的浪潮不断推动着我们从Web2时代向Web3时代迈进。这两个时代在技术架构、用户体验、数据所有权等方面有着显著的差异。本文将为您详细解析Web2与Web3之间的差异&#xff0c;并探讨它们如何塑造我们的数字生活。 定义 Web2&#xff0c;即第二代互联网&#xff0c;以其…

深入解析MongoDB内部架构设计

MongoDB内部构造详解 MongoDB作为一款流行的NoSQL数据库&#xff0c;其内部构造设计独特且高效。以下从多个维度详细解析MongoDB的内部架构和核心组件。 一、整体架构 MongoDB采用分布式架构设计&#xff0c;主要包含以下核心组件&#xff1a;应用层&#xff1a;应用程序通过语…

ubuntu12.04安装opencalib手动标定并使用自己的数据

ubuntu22.04安装opencalib手动标定并使用自己的数据 一、OpenCalib的部署使用 1、基本信息 官网链接: https://github.com/PJLab-ADG/SensorsCalibration/tree/v0.2 (官网下载的zip文件是有问题的,不建议到官网下载) 参考链接: https://blog.csdn.net/qq_49959714/arti…

scss 转为原子css unocss

文章目录前言&#x1f3af; **方案一&#xff1a;混合模式 (推荐)**&#x1f3af; **方案二&#xff1a;语义化组件类**&#x1f3af; **方案三&#xff1a;CSS 模块化**&#x1f3af; **方案四&#xff1a;BEM 命名规范**&#x1f4a1; **推荐做法**前言 记录让c4 从scss 转为…

【面试题】生成式排序了解吗?

生成式排序是搜索排序的前沿方向&#xff0c;核心思想是利用生成式模型的能力来改善排序效果。 技术实现方式&#xff1a;序列到序列重排序 将候选文档列表作为输入序列使用encoder-decoder模型生成重排后的文档序列优势&#xff1a;能捕捉文档间的全局相关性生成式特征提取 使…

【系统架构设计(15)】软件架构设计一:软件架构概念与基于架构的软件开发

文章目录一、核心思想二、软件架构概念&#xff1a;系统设计的高级抽象三、软件架构设计与生命周期&#xff1a;架构在开发流程中的演进四、架构描述语言ADL&#xff1a;架构的标准化表达五、41视图&#xff1a;多角度的架构展现六、基于架构的软件开发概念&#xff1a;架构驱动…