Redis中的客户端(三)

客户端

身份验证

客户端状态的authenticated属性用于记录客户端是否通过了身份验证:

typedef struct redisClient {// ...int authenticated;// ...
} redisClient;

如果authnticated的值为0,那么表示客户端未通过身份验证;如果authenticated的值为1,那么表示客户端已经通过了身份验证

例子

  • 举个例子,对于一个尚未进行身份验证的客户端来说,客户端状态的authenticated的属性如图所示.
    当客户端authenticated属性的值为0时,除了AUTH命令之外,客户端发送的所有其他命令都会被
    服务器拒绝执行:(前提是你需要设置密码requirepass)
    redis.conf
requirepass 1234
(error) NOAUTH Authentication required.
127.0.0.1:6379> SET msg "hello world"
(error) NOAUTH Authentication required.

在这里插入图片描述
当客户端通过AUTH命令成功进入身份验证之后,客户端状态authenticated属性的值就会从0变为1,
如图所示,这时客户端就可以像往常一样向服务器发送命令请求了:

127.0.0.1:6379> AUTH 1234
OK
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET msg "hello world"
OK

authenticated属性仅在服务器启用了身份验证功能时使用,如果服务器没有启用身份验证功能的话,
那么即使authenticated属性的值为0(这是默认值),服务器也不会拒绝执行客户端发送的命令请求。在这里插入图片描述

时间

typedef struct redisClient {// ...time_t ctime;time_t lastinteraction;time_t obuf_soft_limit_reached_time;// ...
}redisClient;
  • 1.ctime属性记录了创建客户端的时间,这个时间可以用来计算客户端与服务器已经连接了多少秒,
    CLIENT list命令的age域记录了这个秒数
127.0.0.1:6379> CLIENT list
id=3 addr=127.0.0.1:58185 fd=10 name= age=741 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
  • 2.lastinteraction属性记录了客户端与服务器最后一次进行互动(interaction)的时间,这里的互动可以是客户端向服务器发送命令请求,也可以是服务器向客户端发送命令回复。lastinteraction属性可以用来计算客户端的空转(idle)时间,也即是,距离客户端与服务器最后一次进行互动以来,已经过去了多少秒,CLIENT list命令的idle域记录了这个秒数
id=3 addr=127.0.0.1:58185 fd=10 name= age=1371 idle=27 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=4 addr=127.0.0.1:60838 fd=9 name= age=8 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
  • 3.obuf_soft_limit_reached_time属性记录了输出缓冲区第一次到达软性限制(soft limit)的时间

客户端的创建与关闭

服务器使用不同的方式来创建和关闭不同类型的客户端

创建普通客户端。

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

例子

举个例子。假设当前有c1和c2两个普通客户端正在连接服务器,那么当一个新的普通客户端c3连接到服务器之后,服务器会将c3所对应的客户端状态添加到clients链表的末尾,如图所示,其中用虚线包围的就是服务器为c3新创建的客户端状态
在这里插入图片描述

关闭普通客户端

一个普通客户端可以因为多种原因而被关闭:

  • 1.如果客户端退出或者被杀死,那么客户端与服务器之间的网络连接将被关闭,从而造成客户端被关闭
  • 2.如果客户端向服务器发送了带有不符合协议格式的命令请求,那么这个客户端也会被服务器关闭
  • 3.如果客户端成为了CLIENT KILL命令的目标,那么它也会被关闭
  • 4.如果用户为服务器设置了timeout配置选项,那么当客户端的空转时间超过timeout选项设置的值时,客户端将被关闭。不过timeout选项有一些例外情况:如果客户端是主服务器(打开了REDIS_MASTER标志),
    从服务器(打开了REDIS_SLAVE标志),正在被BLPOP等命令阻塞(打开了REDIS_BLOCKED标志),或者正在执行SUBSCRIBE、PSUBSCRIBE等订阅命令,那么即使客户端的空转事件超过了timeout选项的值,客户端
    也不会被服务器关闭。
  • 5.如果客户端发送的命令请求的大小超过了输入缓冲区的限制大小(默认为1GB),那么这个客户端会被服务器关闭
  • 6.如果要发送给客户端的命令回复的大小超过了输出缓冲区的限制大小,那么这个客户端会被服务器关闭

可变大小缓冲区由一个链表和任意多个字符串对象组成,理论上来说,这个缓冲区可以保存任意长度的命令回复。但是,为了避免客户端的回复过大,占用过多的服务器资源,服务器会时刻检查客户端的输出缓冲区
的大小,并在缓冲区的大小超出范围时,执行相应的限制操作。
服务器使用两种模式来限制客户端输出缓冲区的大小:

  • 1.硬性限制(hard limit):如果输出缓冲区的大小超过了硬性限制所设置的大小,那么服务器立即关闭客户端
  • 2.软性限制(soft limit):如果输出缓冲区的大小超过了软性限制所设置的大小,但还没有超过硬性限制,那么服务器将使用客户端状态结构的obuf_soft_limit_reached_time属性记录下客户端到达软性限制的起始时间;
    之后服务器会继续监视客户端,如果输出缓冲区的大小一直超出软限制,并且持续时间冲过服务器设定的时长那么服务器将关闭客户端;相反地,如果输出缓冲区的大小在指定时间之内,不再超出软性限制,那么客户端
    就不会被关闭,并且obuf_soft_limit_reached_time属性的值也会被清零。
    使用client-output-buffer-limit选项可以为普通客户端、从服务器客户端、执行发布与订阅功能的客户端分别设置不同的软性限制和硬性限制,该选项的格式为:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
例子

举个例子,

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 64
client-output-buffer-limit pubsub 32mb 8mb 60
  • 第一行设置将普通客户端的硬性限制和软性限制都设置为0,表示不限制客户端的输出缓冲区大小
  • 第二行设置将从服务器客户端的硬性限制设置为256MB,而软性限制设置为64MB,软性限制的时长为60s
  • 第三行设置将执行发布与订阅功能的客户端的硬性限制设置为32MB,软性限制设置为8MB,软性限制的时长为60s

Lua脚本的伪客户端

服务器会在初始化时创建执行Lua脚本中包含的Redis命令的伪客户端,并将这个伪客户端关联在服务器状态结构的lua_client属性中:


typedef struct redisServer {// ...redisClient *lua_client;// ...};

lua_client伪客户端在服务器运行的整个生命周期中会一直存在,只有服务器被关闭时,这个客户端才会被关闭

AOF文件的伪客户端

服务器在载入AOF文件时,会创建用于执行AOF文件包含的Redis命令的伪客户端,并在载入完成之后,关闭伪客户端

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

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

相关文章

智慧酒店(二):AI智能分析网关V4视频分析技术在酒店管理中的应用

一、人工智能技术如何应用在酒店管理中&#xff1f; 随着科技的飞速发展&#xff0c;人工智能技术已经逐渐渗透到我们生活的方方面面&#xff0c;其中&#xff0c;酒店管理行业便是其应用的重要领域之一。人工智能技术以其高效、精准的特点&#xff0c;为酒店管理带来了革命性…

Day34:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 四、 搭建平台管理端前端环境 改造登录功能功能测试 权限管理模块-角色管理 环境搭建开发角色管理接口 权限管理模块-用户管理 开发用户管理CURD接口

题目 2894: 肿瘤检测

题目描述: 一张CT扫描的灰度图像可以用一个N*N&#xff08;0 < N < 100&#xff09;的矩阵描述&#xff0c;矩阵上的每个点对应一个灰度值&#xff08;整数&#xff09;&#xff0c;其取值范围是0-255。我们假设给定的图像中有且只有一个肿瘤。在图上监测肿瘤的方法如下…

31-4 命令执行漏洞 - RCE原理

一、定义 RCE(远程命令/代码执行)漏洞是指存在于软件或系统中的安全漏洞,使得攻击者可以通过网络远程执行操作系统命令或者注入恶意代码,从而控制目标系统。 二、漏洞原理 漏洞原理是指RCE漏洞产生的根本原因,通常与不安全的输入验证、错误的配置和不充分的安全措施有关…

修改nuxtjs项目中的浏览器图标步骤

处理步骤&#xff1a; 打开配置页面 使用el-upload 上传图片到后台 后台把图片转为ico&#xff0c;返回图标路径 配置页面修改本页面预览图&#xff0c;点击保存&#xff0c;修改的数据库。 通知nuxt布局页面&#xff0c;修改head节点中的图标属性&#xff0c;…

如何系统得自学python?——7.列表与元组

列表 一、列表的应⽤场景 列表是Python中最常用的数据结构之一&#xff0c;用于存储一组有序的数据。它在各种场景中都有广泛的应用&#xff0c;例如&#xff1a; 存储多个相同类型的数据&#xff0c;如学生成绩、员工工资等。存储不同类型的数据&#xff0c;如图书信息&…

Channel 结合 Select 使用

在Go语言中&#xff0c;channel和select结合使用是一种强大的并发模式。channel允许在不同的goroutine之间安全地传递消息&#xff0c;而select使得goroutine可以同时等待多个通信操作&#xff08;channel操作&#xff09;。 select语句等待多个channel操作中的任意一个完成。…

《VulnHub》Lampião:1

title: 《VulnHub》Lampio&#xff1a;1 date: 2024-03-28 21:37:49 updated: 2024-03-28 21:37:50 categories: WriteUp&#xff1a;Cyber-Range excerpt: 关键技术&#xff1a;主机发现&#xff0c;端口扫描、服务探测、操作系统探测&#xff0c;对开放的端口探测漏洞&#x…

寒冬继续!飞书发全员信 “适当精简团队规模”

多精彩内容在公众号。 3月26日飞书CEO谢欣发布全员信&#xff0c;宣布进行组织调整&#xff0c;同时为受到影响的“同学”提供补偿方案和转岗机会。 在致员工的一封信中&#xff0c;谢欣坦诚地指出&#xff0c;尽管飞书的团队人数众多&#xff0c;但组织结构的不够紧凑导致了工…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

redis缓存穿透、缓存击穿、缓存雪崩及其解决方法

缓存穿透、缓存击穿、缓存雪崩是redis的三大问题。 在介绍这三大问题之前&#xff0c;我们需要先了解Redis作为一个缓存中间件&#xff0c;在项目中是如何工作的。首先看一下在没有缓存中间件的时候的系统数据访问的架构图&#xff1a; 客户端发起一个查询请求的时候&#xff…

Maya 2024 for Mac/Win:重塑三维创意世界的利器

在数字化浪潮汹涌的当下&#xff0c;三维图形软件早已成为创意产业不可或缺的重要工具。而在这其中&#xff0c;Maya 2024以其卓越的性能和丰富的功能&#xff0c;赢得了无数设计师的青睐。无论是Mac还是Win平台&#xff0c;Maya 2024都能为您的三维创作提供强大的支持。 Maya…

【ssh免密设置】

本机远程的服务器上执行&#xff1a; ssh-keygen -t rsa2.然后修改公钥的权限&#xff08;xxxxx.pub需要替换&#xff09; chmod 600 xxxxx.pub3.再执行命令&#xff0c;将公钥导到免密的服务器上&#xff08;服务器ip地址替换成自己的&#xff09; ssh-copy-id root服务器i…

算法系列--动态规划--背包问题(2)--01背包拓展题目

&#x1f495;"2024.3.28小米汽车发布"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–动态规划–背包问题(2)–01背包拓展题目 大家好,今天为大家带来的是算法系列--动态规划--背包问题(2)--01背包拓展题目 1.分割等和⼦集 链接: https:/…

史上最全-Java面试题(涵盖基础、高级、框架、微服务、中间件、大厂真题等28个大类超3000+面试题,全部附带详细答案)

3月4月又到了一年一度的跳槽黄金期,无论几年经验,也无论技术能力如何,跳槽前都离不开面试准备,其中刷面试题是重中之重。 刷面试题的时候一大痛点就是太分散了,需要自己根据知识点一项一项的去搜,容易遗漏知识点而且面试题质量无法保证,非常痛苦,基于此我花了两个月的…

微信小程序修改checkbox和radio的样式

我们在开发小程序的时候&#xff0c;有时候需要修改小程序中checkbox和radio的原生样式&#xff0c;如何修改呢&#xff1f;这里给大家提供了一份代码&#xff0c;大家可以试试。 首先是修改checkbox样式的代码&#xff1a; /* 重写 checkbox 样式 */ /* 未选中的 背景样式 *…

AMS概念以及面试相关整理

1、ActivityManagerService是什么&#xff1f;什么时候初始化的&#xff1f;有什么作用&#xff1f; ActivityManagerService&#xff08;AMS&#xff09;是什么&#xff1f; ActivityManagerService&#xff08;简称AMS&#xff09;是Android操作系统中的一个核心服务&#…

实现简易的 axios

1、实现逻辑 Promise XMLHttpRequest 封装 ① 返回一个 promise 实例 new XMLHttpRequest 并设置默认请求方式、请求根路径&#xff1b; 添加请求响应事件&#xff1b; 根据状态码&#xff0c;对应执行成功或者失败的调用函数&#xff0c;并把结果传进去&#xff1b; ② …

场内基金的折溢价

场内基金会出现折溢价&#xff0c;主要原因是场内基金有申购赎回&#xff0c;买入卖出这两套操作。 交易价格<基金净值&#xff0c;就是折价 交易价格>基金净值&#xff0c;就是溢价 如何判断场内基金的折溢价 ETF最好判断&#xff0c;有实时净值IOPV&#xff0c;交易价…

AOP切入点表达式基本格式

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方地址 https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html AOP切入点表达式基本格式如下&#xff1a; execution(modifiers-patte…