redis-客户端

article/2025/9/20 10:08:09

redis-客户端

1、客户端属性

redis> CLIENT listaddr=127.0.0.1:53428 fd=6 name= age=1242 idle=0 ...
addr=127.0.0.1:53469 fd=7 name= age=4 idle=4 ...
typedef struct redisClient {// ...int fd;robj *name;int flags;sds querybuf;robj **argv;int argc;struct redisCommand *cmd;char buf[REDIS_REPLY_CHUNK_BYTES];int bufpos;list *reply;int authenticated;time_t ctime;time_t lastinteraction;time_t obuf_soft_limit_reached_time;// ...} redisClient;
  • 套接字描述符fd

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

    • 使用 CLIENT_SETNAME 命令可以为客户端设置一个名字, 让客户端的身份变得更清晰
  • 标志flags

    • flags 属性的值可以是单个标志:flags = <flag>
    • 多个标志的二进制或:flags = <flag1> | <flag2> | ...
  • 输入缓冲区querybuf

    • 客户端状态的输入缓冲区用于保存客户端发送的命令请求:
      • 如果客户端向服务器发送了以下命令请求:SET key value
      • 客户端状态的 querybuf 属性将是一个包含以下内容的 SDS 值:*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
  • 命令与命令参数(argv argc)

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

    • 该表是一个字典, 字典的键是一个 SDS 结构, 保存了命令的名字, 字典的值是命令所对应的 redisCommand 结构, 这个结构保存了命令的实现函数、 命令的标志、 命令应该给定的参数个数、 命令的总执行次数和总消耗时长等统计信息。

    • 当程序在命令表中成功找到 argv[0] 所对应的 redisCommand 结构时, 它会将客户端状态的 cmd 指针指向这个结构:

      digraph {      label = "\n 图 13-7    查找命令并设置 cmd 属性";      rankdir = LR;      node [shape = record];      command_table [label = " dict | ... |  "set" | ... |  "get" | ... |  "rpush" | ... ", width = 1.5 ];      node [label = "  redisCommand | ... "];      command_table:set -> set:head [style = dashed];     command_table:get -> get:head;     command_table:rpush -> rpush:head;      redisClient [label = " redisClient | ... |  cmd | ... "];      set:head -> redisClient:cmd [dir = back, label = "2) \n 设置 \n cmd \n 属性"];      find [label = "1) \n 查找 \n "SET" \n 对应的\n redisCommand \n 结构", shape = plaintext];      find -> command_table:set [style = dashed];  }

  • 输出缓冲区(buf bufpos)

    • 执行命令所得的命令回复会被保存在客户端状态的输出缓冲区里面, 每个客户端都有两个输出缓冲区可用, 一个缓冲区的大小是固定的, 另一个缓冲区的大小是可变的:
      • 固定大小的缓冲区用于保存那些长度比较小的回复, 比如 OK 、简短的字符串值、整数值、错误回复,等等。
      • 可变大小的缓冲区用于保存那些长度比较大的回复, 比如一个非常长的字符串值, 一个由很多项组成的列表, 一个包含了很多元素的集合, 等等。
    • 客户端的固定大小缓冲区由 bufbufpos 两个属性组成:
      • buf 是一个大小为 REDIS_REPLY_CHUNK_BYTES 字节的字节数组, 而 bufpos 属性则记录了 buf 数组目前已使用的字节数量。REDIS_REPLY_CHUNK_BYTES 常量目前的默认值为 16*1024 , 也即是说, buf 数组的默认大小为 16 KB
    • 可变大小缓冲区由 reply 链表和一个或多个字符串对象组成:
      • 通过使用链表来连接多个字符串对象, 服务器可以为客户端保存一个非常长的命令回复, 而不必受到固定大小缓冲区 16 KB 大小的限制
  • 身份验证

    • 客户端状态的 authenticated 属性用于记录客户端是否通过了身份验证:
      • 如果 authenticated 的值为 0 , 那么表示客户端未通过身份验证; 如果 authenticated 的值为 1 , 那么表示客户端已经通过了身份验证
  • 时间

    • ctime 属性记录了创建客户端的时间, 这个时间可以用来计算客户端与服务器已经连接了多少秒
    • lastinteraction 属性记录了客户端与服务器最后一次进行互动(interaction)的时间, 这里的互动可以是客户端向服务器发送命令请求, 也可以是服务器向客户端发送命令回复。
    • obuf_soft_limit_reached_time 属性记录了输出缓冲区第一次到达软性限制(soft limit)的时间

2、客户端的创建与关闭

  • 创建普通客户端

    • 如果客户端是通过网络连接与服务器进行连接的普通客户端,那么在客户端使用 connect 函数连接到服务器时,服务器就会调用连接事件处理器,为客户端创建相应的客户端状态,并将这个新的客户端状态添加到服务器状态结构 clients链表的末尾。
  • 关闭普通客户端

    • 如果客户端进程退出或者被杀死,那么客户端与服务器之间的网络连接将被关闭
    • 如果客户端向服务器发送了带有不符合协议格式的命令请求
    • 如果客户端成为了 CLIENT KILL 命令的目标
    • 如果用户为服务器设置了timeout配置选项,那么当客户端的空转时间超过timeout 选项设置的值时,客户端将被关闭。不过 timeout 选项有一些例外况:如果客户端是主服务器(打开了REDIS_MASTER标志),从服务器(打开了 REDISSLAVE标志),正在被BLPOP等命令阻塞(打开了 REDIS_BLOCKED志),或者正在执行 SUBSCRIBE、PSUBSCRIBE 等订阅命令,那么即使客户端的空转时间超过了 timeout 选项的值,客户端也不会被服务器关闭。
    • 如果客户端发送的命令请求的大小超过了输人缓冲区的限制大小(默认为1GB)
    • 如果要发送给客户端的命令回复的大小超过了输出缓冲区的限制大小
    • 方面介绍输出缓冲区的时候提到过,可变大小缓冲区由一个链表和任意多个字符串对象
  • 伪客户端

    • 处理 Lua 脚本的伪客户端在服务器初始化时创建, 这个客户端会一直存在, 直到服务器关闭。
    • 载入 AOF 文件时使用的伪客户端在载入工作开始时动态创建, 载入工作完毕之后关闭。

http://chatgpt.dhexx.cn/article/tu9J8Ijo.shtml

相关文章

Mac上好用的redis客户端推荐

推荐mac一个开源免费、好用的redis客户端&#xff1a;QuickRedis 它支持直连、哨兵、集群模式&#xff0c;并且UI是可以的&#xff0c;并且支持树形展示,同时支持json格式展示&#xff0c; 最基本的命令行模式也支持&#xff0c;总体来说界面简洁、功能完善&#xff0c;值得推…

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 Redis管理客户端&#xff0c;兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…

用Redis客户端工具连接Redis

进入redis安装目录 vi redis.conf1.关闭默认的只允许本地登录 2.关掉保护模式 3.requirepass注释去掉&#xff0c;修改密码 4. 开启redis后台运行 5.安装redis客户端连接工具 6.确保 Linux 防火墙已经关闭&#xff0c;再连接redis systemctl stop firewalld.service syste…

【Redis入门篇】| Redis的Java客户端

目录 一&#xff1a; Redis的Java客户端 1. Jedis快速入门 2. Jedis连接池 3. SpringDataRedis快速入门 4. RedisSerializer配置 5. StringRedisTemplate 图书推荐 一&#xff1a; Redis的Java客户端 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;…

redis客户端

1、redis-cli redis自己给我们提供的一个命令行客户端 2、Java客户端-Jedis 是一个Redis的java客户端&#xff08;Java for Redis&#xff09;&#xff0c;老牌的、稳定、封装少的客户端 导包 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><d…

Redis可视化客户端

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 redis的可视化客户端目前较流行的有三个&#xff1a;Redis Client ; Redis Desktop Manager ; Redis Studio. Redis Desktop Ma…

【Redis学习笔记(九)】之 Redis客户端详解

文章目录 本文章由公号【开发小鸽】发布&#xff01;欢迎关注&#xff01;&#xff01;&#xff01;一&#xff0e; 客户端&#xff08;一&#xff09; 概述&#xff08;二&#xff09; 客户端属性1. 套接字描述符2. 名字3. 标志4. 输入缓冲区5. 命令与命令参数6. 命令的实现函…

[Redis]Redis客户端

文章目录 1. Redis 客户端2. Redis 命令行客户端2.1 redis-cli 的使用2.1.1 进入 redis-cli 交互控制台方式一2.1.1 进入 redis-cli 交互控制台方式二 3. Redis 图形化桌面客户端3.1 Redis 图形化桌面客户端下载3.2 Redis 图形化桌面客户端安装3.3 Redis 图形化桌面客户端连接 …

Redis 基础 -- Redis可视化客户端(Redis Desktop Manager)

文章目录 1. Redis可视化客户端&#xff08;Redis Desktop Manager&#xff09;1.1 下载Redis Desktop Manager1.2 安装 Redis Desktop Manager1.3 连接Redis服务器1.4 Redis Desktop Manager 基础操作教学1.4.1 删除数据1.4.2 添加数据1.4.3 查看数据&#xff08;点击即可&…

几款连接redis的客户端(GUI客户端),下面记录了我使用的几款

几款连接redis的客户端(GUI客户端)&#xff0c;下面记录了我使用的几款 一、Redis 客户端 1、命令行工具 命令行 (建议使用&#xff0c;简单) 比如windows的cmd和Linux、Mac的Terminal&#xff0c;虽然最简单好用。 必须保证有 redis-cli 命令(windows 是 redis-cli.exe)&…

windows下Nginx启动失败(常见的两个错误以及解决方案)

问题 windows 10 下启动nginx&#xff0c;闪屏而过&#xff0c;访问localhost显示无法访问。 尝试解决 cmd下使用命令&#xff1a;netstat -an | find "0.0.0.0:80"&#xff0c;可以发现80端口已经被占用。 使用命令&#xff1a;netstat -ano 可以发现占用80端口的…

nginx 启动前端包

项目是前后端分离&#xff1a;前端用vue开发&#xff0c;后端用的是springboot开发&#xff0c;用nginx启动代理&#xff0c;启动前端包 1、安装nginx&#xff08;此步骤就不细说了&#xff0c;如图&#xff09; 2、将前端包放入nginx文件夹下 注&#xff1a;我放在project文…

Nginx 安装教程 (windows) 及详解 并通过Nginx启动项目(vue项目举例)

Nginx 常用命令 Nginx windows安装教程 通过Nginx启动项目(vue项目举例) 目录介绍 Nginx Nginx 是俄罗斯人 Igor Sysoev 编写的轻量级Web服务器&#xff0c;它的发音为 [ˈendʒɪnks] &#xff0c;它不仅是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/P…

nginx修改监听端口号8080_解决Nginx启动失败

一、Nginx下载 http://nginx.org/en/download.html 二、Nginx启动失败原因 1、本人下载的是nginx-1.12.1(稳定版)&#xff0c;下载完解压后&#xff0c;进入路径中&#xff0c;start nginx&#xff0c;发现窗口闪过。但是查找不到nginx进程。 2、进入 nginx-1.12.1\logs 路径下…

linux下nginx启动不了,Nginx启动失败的几种错误处理

nginx启动失败 启动nginx失败&#xff0c;报错信息如下: Starting nginx: nginx: [emerg] bind() to 0.0.0.0:**** failed (13: Permission denied) 这通常是因为开启了SELinux的原因&#xff0c;使用命令 getenforce 可以查看SELinux状态&#xff0c;如果输出为 enforcing …

NGINX启动报错,端口被占用

NGINX启动报错&#xff0c;端口被占用解决方案&#xff08;修改端口号&#xff09;   Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点&#xff08;俄文&#x…

nginx 启动、停止、关闭

1&#xff0c;nginx 指定配置文件 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -c 参数 指定了要加载的nginx配置文件路径 1,从容停止Nginx&#xff1a; kill -QUIT 主进程号 2,快速停止Nginx&#xff1a; kill -TERM 主进程号 3,强制停止Nginx&am…

nginx启动web项目

1、服务器任何路径新建存放项目文件夹 例如:/home/www/xtzl_platform_web 将web项目的压缩包存放到xtzl_platform_web目录下并解压 3、修改nginx配置文件nginx.conf cd /usr/local/nginx/conf ,修改nginx.conf文件 添加新路径 (1)alias方式 location后面的文件名…

nginx 启动报错

systemctl start nginx 启动报错 报错内容如下&#xff1a; Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details. nginx -t 检查没有问题 systemctl status n…

nginx启动失败

启动nginx失败&#xff0c;报错信息如下 查看日志&#xff0c;centos下&#xff0c;ngin新的日志文件夹是/var/log/nginx&#xff0c;里面有多个文件 原来是配置文件有问题。 以下是test.cn.conf文件内容 日志文件第一行&#xff0c;是指location ~ \.php$ { 这行中的$和{之间…