《Redis设计与实现》读书笔记-客户端

news2024/12/28 3:34:35

目录

1.Client简介

2.客户端属性

1)(本文重点)比较通用的属性

2)(后续分享)另外一类是和特定功能相关的属性

2.1套接字文件描述符

2.2名字

2.3标志(flag)

2.4输入缓冲区

2.5命令参数和个数

2.6命令函数

2.7输出缓冲区

3.总结


1.Client简介

Redis 服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,
每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并
向客户端返回命令回复。
通过使用由1/0多路复用技术实现的文件事件处理器,Redis 服务器使用单线程单进程
的方式来处理命令请求,并与多个客户端进行网络通信。
对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/
redisclient 结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相
关功能时需要用到的数据结构,其中包括:

Redis 服务器状态结构的 clients属性是一个链表这个链表保存了所有与服务器连
接的客户端的状态结构,对客户端执行批量操作,或者查找某个指定的客户端
,都可以通过遍历clients连表完成。

2.客户端属性

客户端状态包含的属性可以分为两类:


1)(本文重点)比较通用的属性

        这些属性很少与特定功能相关,无论客户端执行的是什么
工作,它们都要用到这些属性。


2)(后续分享)另外一类是和特定功能相关的属性

 比如操作数据库时需要用到的ab 属性和dictid属性,执行事务时需要用到的mstate 属性,以及执行 WATCH命令时需要用到的watched_keys 属性等等。
本章将对客户端状态中比较通用的那部分属性进行介绍,至于那些和特定功能相关的属
性,后面会继续分享。

2.1套接字文件描述符

客户端状态的fd属性记录了套接字描述符。

tydedef struct redisClient{

    int fd;
}

根据客户端类型的不同,fd属性的值可以是-1或者是大于-1 的整数:
1)伪客户端(fake client)的fd属性的值为-1:伪客户端处理的命令请求来源于AOF
文件或者Lua脚本
,而不是网络,所以这种客户端不需要套接字连接,自然也不需
要记录套接字描述符。目前 Redis 服务器会在两个地方用到伪客户端,一个用于载
人AOF 文件并还原数据库状态,而另一个则用于执行Lua 脚本中包含的Redis命令。


2) 普通客户端的Ed属性的值为大于-1的整数:普通客户端使用套接字来与服务器进
行通信,所以服务器会用fd 属性来记录客户端套接字的描述符。因为合法的套接字
描述符不能是-1,所以普通客户端的套接字描述符的值必然是大于-1 的整数。

2.2名字

在默认情况下,一个连接到服务器的客户端是没有名字的。
比如在下面展示的 CLIENT list命令示例中,两个客户端的name 域都是空白的:

设置名字:setname命令

2.3标志(flag)

用了记录client的角色,以及处于什么状态。

tydedef struct redisClient{

    int flags;
}

每个标志使用一个常量表示,一部分标志记录了客户端的角色:
1)在主从服务器进行复制操作时,主服务器会成为从服务器的客户端,而从服务器也
会成为主服务器的客户端。REDIS_MASTER 标志表示客户端代表的是一个主服务
器,REDIS_SLAVE 标志表示客户端代表的是一个从服务器。
REDIS_PRE_PSYNC标志表示客户端代表的是一个版本低于 Redis2.8的从服务器,
主服务器不能使用PSYNC命令与这个从服务器进行同步。这个标志只能在 REDIS_
SLAVE 标志处于打开状态时使用。
2)REDIS_LUA_CLIENT标识表示客户端是专门用于处理Lua 脚本里面包含的 Redis
命令的伪客户端。
而另外一部分标志则记录了客户端目前所处的状态:
3) REDIS_MONITOR标志表示客户端正在执行MONITOR命令。
4)REDIS_UNIX_SOCKET 标志表示服务器使用 UNIX 套接字来连接客户端。
5) REDIS_BLOCKED 标志表示客户端正在被 BRPOP、BLPOP等命令阻塞。
6) REDISUNBLOCKED 标志表示客户端已经从 REDIS_BLOCKED 标志所表示的阻塞状

2.4输入缓冲区

        用于保存客户端发送的命令请求

        最大限制:1G

tydedef struct redisClient{

    sds querybuf;
}

2.5命令参数和个数

在服务器将客户端发送的命令请求保存到客户端状态的querybuf 属性之后,服务器
将对命令请求的内容进行分析,并将得出的命令参数以及命令参数的个数分别保存到客户端
状态的 argv 属性和 argc属性

argv 属性是一个数组,数组中的每个项都是一个字符串对象,其中 argv[0]是要执
行的命令,而之后的其他项则是传给命令的参数。
argc属性则负责记录 argv 数组的长度

2.6命令函数

当服务器从协议内容中分析并得出 argv 属性和 arge 属性的值之后,服务器将根据项
argv 101的值,在命令表中查找命令所对应的命令实现函数。
图13-7展示了一个命令表示例,该表是一个字典,字典的键是一个 SDS结构,保存
了命令的名字,字典的值是命令所对应的rediscommand 结构,这个结构保存了命令的实
现函数、命令的标志、命令应该给定的参数个数、命令的总执行次数和总消耗时长等统计
信息。

2.7输出缓冲区

服务端执行命令的回复,会保存到输出缓冲区,共2个缓冲区

1)固定大小:存OK,错误命令,简单的字符串,整数值

2)可变的:长字符串,列表,集合等。

通过使用链表来连接多个字符串对象,服务器可以为客户端保存一个非常长的命令回 复,而不必受到固定大小缓冲区16KB大小的限制。 

3.总结

口客户端状态的Elags 属性使用不同标志来表示客户端的角色,以及客户端当前所处
的状态。
口 输人缓冲区记录了客户端发送的命令请求,这个缓冲区的大小不能超过1GB。
口 命令的参数和参数个数会被记录在客户端状态的 argv 和 argc 属性里面,而 cmd
属性则记录了客户端要执行命令的实现函数。
口 客户端有固定大小缓冲区和可变大小缓冲区两种缓冲区可用,其中固定大小缓冲区
的最大大小为16 KB,而可变大小缓冲区的最大大小不能超过服务器设置的硬性限
制值。
口 输出缓冲区限制值有两种,如果输出缓冲区的大小超过了服务器设置的硬性限制,
那么客户端会被立即关闭;除此之外,如果客户端在一定时间内,一直超过服务器
设置的软性限制,那么客户端也会被关闭。
口 当一个客户端通过网络连接连上服务器时,服务器会为这个客户端创建相应的客户
端状态。网络连接关闭、发送了不合协议格式的命令请求、成为 CLIENT KILL 命令
的目标、空转时间超时、输出缓冲区的大小超出限制,以上这些原因都会造成客户
端被关闭。
口处理Lua 脚本的伪客户端在服务器初始化时创建,这个客户端会一直存在,直到服
务器关闭。
口 载人AOF 文件时使用的伪客户端在载人工作开始时动态创建,载人工作完毕之后关闭。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esp-idf-v5.1.1所有官方例程讲解(esp32、esp32-C2、esp32-S3)之 a2dp_sink 详解

目录 1. 获取ESP-IDF和示例代码 2. 导航到示例代码 3. 示例代码结构 4. 关键文件解析 main.c 初始化和配置: bt_app_core.c 和 bt_app_core.h bt_app_av.c 和 bt_app_av.h A2DP事件处理: AVRCP事件处理: bt_app_sink.c 和 bt_app_sink.h 5. 编译和烧录 6. 测试…

【Linux】全志Tina etc目录下关键文件内容修改

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\target\allwinner\c200s-F1C200s\busybox-init-base-files\etc\ssv6x5x-wifi.cfg 二、文件内容 三、介绍 在此目录下,可以修改在etc目录下的文件内容,此处举例修改一个wifi模块的配置文件数据。

探索Python的`retries`库:让代码更健壮的利器

探索Python的retries库:让代码更健壮的利器 背景:为何选择retries库? 在软件开发过程中,我们经常会遇到需要重复尝试执行某些操作的情况,比如网络请求、文件读写等。这些操作可能会因为各种原因暂时失败,但…

计算机专业,如何在大一领先其他人?关键是打破信息差!

高考录取陆续结束,不少同学报考计算机专业,然而,大部分人面对即将开启的计算机本科课程还是一无所知。 计算机的大学四年,都学些什么?要一直跟字符打交道吗?其实不然,编程的世界远比我们想象的…

[BJDCTF2020]EasySearch (SSI注入漏洞)

这题ctrlU发现往index.php提交数据,但是我目录,git泄露,sqlmap,爆破admin密码都没有作用,数据包页面也没有什么重置密码注册的功能 这种三无题多半是要拿源码做的,我又拿我备份文件字典扫了一下结果发现ind…

开发无人带货直播插件

在当今快速发展的电商行业中,直播带货已成为推动销售增长的重要力量,然而,随着直播市场的日益饱和和消费者需求的不断变化,如何在保持直播互动性的同时,实现高效、低成本的运营成为许多商家关注的焦点。 无人带货直播…

Python | Leetcode Python题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLIS(self, nums: List[int]) -> int:d []for n in nums:if not d or n > d[-1]:d.append(n)else:l, r 0, len(d) - 1loc rwhile l < r:mid (l r) // 2if d[mid] > n:loc midr mid - 1else:l…

c语言排序(1)

前言 排序在数据结构中占有非常重要的地位&#xff0c;我们在前面二叉树的数组实现时也用到了堆排序&#xff0c;下面我们就系统地讲一下排序。 1. 排序及其运用 1.1 什么是排序 所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff…

合并两个列头不同的表格

有两个Excel的"named ranges"&#xff0c;Events1和Events2。从第2行开始&#xff0c;它们都可以看做带表头的表格&#xff0c;并有部分表头相同。 Column1Column2Column3Column4DATEFIRST NAMESURNAMECODE1/2/2024JohnSmith31/2/2024LilyJJ33 Column1Column2Column…

【C++】类和对象——流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时&#xff0c;在输入和输出打印时&#xff0c;经常会调用两个函数&#xff1a; void Insert()//输入函数{cin >> _year;cin >> _mo…

四款免费文案生成器app,你的文案创作神器

文案创作不仅需要创意和洞察力&#xff0c;还需要对语言的精准掌握。对于许多个人创作者和中小企业来说&#xff0c;聘请专业文案人员可能成本过高&#xff0c;而自己创作又可能面临灵感枯竭的困境。这时&#xff0c;免费的文案生成器App就显得尤为重要。免费文案生成器app的出…

Electron学习笔记(二)Hello World

目录 前言 运行主进程 创建界面 使用窗口打开界面 管理窗口的生命周期 关闭所有窗口时退出应用 (Windows & Linux)​ 如果没有窗口打开则打开一个窗口 (macOS) 使用预加载脚本访问渲染器的Node.js 添加你自己的功能 完整代码展示 效果展示 前言 接上一篇文章 …

JWT详细解析

目录 1. 什么是JWT&#xff1f; 2. 前后端完全分离认证问题 3. JWT的原理 4. JWT的数据结构 5. Header 6. Payload 7. Signature 8.JWT的使用方式 1. 什么是JWT&#xff1f; Json web token (JWT)&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于JSON的开放…

nginx服务---负载均衡、平滑升级

一、nginx服务配置属性监控、nginx代理服务和nginx的IP访客黑名单 1.属性监控 通过在编译时加入 nginx 的 ngx_http_stub_status_module 模块可以实时监控以下基本的指标&#xff1a; 部署过程&#xff1a; 在配置文件/usr/local/nginx/conf/nginx.conf中的server模块中&…

【uniapp离线打包】(基于Android studio)

文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)二、准备工作&#xff08;Android壳和uniapp包&#xff09;导入Android壳生成uniapp包将uniapp包导入android壳 三、准备工作&#xff08;证书、&#xff09;准备Android平台离线签名证书 四、修改配置参数build.gradl…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增&#xff0c;是一种通过应用合理且随机的变换&#xff08;例如图像位移、旋转&#xff09;来增加训练集多样性的技术。让有限的数据产生等价于更多数…

卷积神经网络(五)---图像增强的方法

前面的部分专注于卷积神经网络的层结构介绍&#xff0c;同时还介绍了到目前为止比较出名的卷积神经网络&#xff0c;接着使用比较复杂的卷积神经网络提高了 MNIST 数据集的准确率。下面将从另外的角度——图像增强的方面入手&#xff0c;提高模型的准确率和泛化能力。 一直以来…

C# 弃元的详解与示例

文章目录 1. 什么是弃元&#xff1f;2. 弃元的语法3. 弃元的应用场景4. 示例代码5. 总结 在C# 7.0及更高版本中&#xff0c;弃元&#xff08;Discard&#xff09;是一个新的语言特性&#xff0c;允许开发者在特定情况下忽略某些值。这在处理元组、解构操作或其他只需要部分值的…

【区块链+绿色低碳】泸州:“绿芽积分”号召全民绿色减碳 | FISCO BCOS应用案例

2021 年 6 月 5 日&#xff0c; 首个基于“绿普惠云”所构建的政府级碳普惠平台“泸州市‘绿芽积分’”在生态环境部 2021 年 六五世界环境日国家主场活动中展示&#xff0c;并跻身进入生态环境部“提升公民生态文明意识行动计划”2021 十佳公众 参与案例。 “绿普惠云”是为政…

精通推荐算法11:基于异构图游走的Graph Embedding

DeepWalk、Line和Node2vec对图结构数据进行随机游走&#xff0c;成功将其转化为一个序列问题&#xff0c;并利用Word2vec训练得到节点的Embedding向量。但它们都基于同构图&#xff0c;其节点均属于同一种类型。但现实世界的数据网络大多基于异构图&#xff0c;其节点类型以及节…