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

目录

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 文件时使用的伪客户端在载人工作开始时动态创建,载人工作完毕之后关闭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置

目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …

10篇--图像噪点消除

概念 何为噪点? 噪点:指图像收到的一些干扰因素,通常是由图像采集设备、传输信道等因素造成的,表现为图像中随机的亮度,也可以理解为有那么一些点的像素值与周围的像素值格格不入。 常见的噪声类型 高斯噪声&#…

【开源免费】基于Vue和SpringBoot的渔具租赁系统(附论文)

本文项目编号 T 005 ,文末自助获取源码 \color{red}{T005,文末自助获取源码} T005,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 渔…

Linux网络基础-----传输层UDP协议

目录 端口号: 查询各类服务的端口号 加深理解端口号: UDP协议 UDP协议特点: 关于缓冲区: 内核层面理解UDP报文 端口号: 知名端口号:0 ~ 1023:被HTTP、SSH等应用层协议广泛使用的端口号&…

XXE靶场

XXE-lab 靶场 靶场网址&#xff1a;http://172.16.0.87/ 第一步我们看到网站有登录框我们试着用 bp 去抓一下包 将抓到的包发到重放器中 然后我们构建palody <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/readconvert.base64-encode/resourceC:/flag/fla…

ubuntu+ros新手笔记(三):21讲没讲到的MoveIt2

1 安装MoveIt2 安装参照在ROS2中&#xff0c;通过MoveIt2控制Gazebo中的自定义机械手 安装 MoveIt2可以选择自己编译源码安装&#xff0c;或者直接从二进制安装。 个人建议直接二进制安装&#xff0c;可以省很多事。 sudo apt install ros-humble-moveitmoveit-setup-assistan…

运维 mysql、redis 、RocketMQ性能排查

MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令&#xff0c;可以用来查看服务器的状态信息&#xff0c;包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数&#xff0c;即当前…

jmeter连接mysql

查询mysql数据库版本 SELECT VERSION(); 下载jmeter mysql 驱动jar包&#xff0c;版本低于mysql版本&#xff0c;放在jmeter的lib 路径下 MySQL :: Download MySQL Connector/J (Archived Versions) 添加JDBC Connection Configuration 填写 variable name 及数据库信息 注意…

Docker的容器

目录 1. 什么是容器&#xff1f;2. 容器的生命周期2.1 容器处理OOM事件2.2 容器异常退出2.3 容器暂停 3. 容器命令详解3.1 容器命令清单3.2 docker create命令3.3 docker run命令3.4 docker ps命令3.5 docker logs命令3.6 docker attach命令3.7 docker exec命令3.8 docker stat…

JAVA题目笔记(二十六)反射

一、保存信息 Student类&#xff1a; package testpackage;import java.io.IOException;public class Student {private String name;private String area;public String testfield;private int age;public Student() {}public Student(String name, String area, int age) {t…

python 配置 oracle instant client

1.问题描述 想用python连接oracle数据库&#xff0c;百度得知需要cx_Oracle这个第三方库 import cx_Oracle# 设置Oracle数据源名称 dsn cx_Oracle.makedsn(host, port, service_nameservice_name)# 创建数据库连接 connection cx_Oracle.connect(userusername, passwordpas…

皮肤伤口分割数据集labelme格式248张5类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;284 标注数量(json文件个数)&#xff1a;284 标注类别数&#xff1a;5 标注类别名称:["bruises","burns","cu…

Ollama配置与webUI本地部署-学习记录

Ollama 前言一、Ollama的下载与安装设置(windows)1.下载2.安装与配置1.查看环境变量&#xff1a;2.设置环境变量&#xff1a;3.设置变量 二、使用步骤1.查找模型2.使用Ollama1.下载模型2.使用 三、WebUI部署WebUI 总结 前言 Ollama是一款可以开始使用本地的大型语言模型。启动…

vscode不同项目使用不同插件

转载请注明出处&#xff1a;小帆的帆的博客 在使用vscode开发不同项目时可能会用到不同的插件。手动管理不够优雅&#xff0c;本文介绍使用Profiles的方式的来管理不同项目的插件。 手动管理不同项目的插件 本来vscode安装了有三个插件 这时需要新建一个项目&#xff0c;新…

数据结构 ——前缀树查词典的实现

数据结构 ——前缀树查词典的实现 一、前缀树的概念 前缀树是一种多叉树结构&#xff0c;主要用于存储字符串。每个节点代表一个字符&#xff0c;路径从根节点到叶节点表示一个完整的字符串。前缀树的关键特征是 共享前缀&#xff0c;也就是说&#xff0c;如果两个字符串有相…

H5 中 van-popup 的使用以及题目的切换

H5 中 van-popup 的使用以及题目的切换 在移动端开发中&#xff0c;弹窗组件是一个常见的需求。vant 是一个轻量、可靠的移动端 Vue 组件库&#xff0c;其中的 van-popup 组件可以方便地实现弹窗效果。本文将介绍如何使用 van-popup 实现题目详情的弹窗展示&#xff0c;并实现…

leetcode 36.有效的数独

1.题目要求: 2.题目步骤: 写好判断函数 3.题目代码: class Solution { public:bool isvalid(vector<vector<char>>& board,char num,int row,int col){//先找左下标int leftrow row - 1;while(leftrow > 0){if(board[leftrow][col] num){return fals…

ElasticSearch中的深度分页问题

在使用 ElasticSearch 进行搜索时&#xff0c;很多小伙伴会遇到“深度分页”问题。当需要获取大量的分页数据时&#xff0c;查询性能会急剧下降&#xff0c;甚至导致集群负载过高。这篇文章将深入剖析 ElasticSearch 深度分页的成因、危害&#xff0c;并提供一些常用的优化方案…

Eureka学习笔记-服务端

Eureka学习笔记 服务端 模块设计 Resources &#xff1a;这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外&#xff0c;其他的 Server 在同步 Registry 时也需要调用这些接口。Controller &#xff1a;这里提…

快速上手:利用 FFmpeg 合并音频文件的实用教程

FFmpeg 是一个强大的多媒体处理工具&#xff0c;能够轻松地对音频、视频进行编辑和转换。本文将介绍如何使用 FFmpeg 来合并&#xff08;拼接&#xff09;多个音频文件为一个单一文件。无论您是想要创建播客、音乐混音还是其他任何形式的音频项目&#xff0c;这都是一个非常实用…