客户端
来源:互联网 发布:淘宝售后记录怎么删除 编辑:程序博客网 时间:2024/04/29 03:10
redis服务器是一个典型的一对多服务器程序,通过I/O多路复用技术实现的文件事件处理器,redis服务器使用单线程单进程的方式来处理命令请求,并于多个客户端进行网络通信。
1. 客户端状态及属性
redis.h/redisClient结构,保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,
/* With multiplexing we need to take per-client state. * Clients are taken in a liked list. * * 因为 I/O 复用的缘故,需要为每个客户端维持一个状态。 * * 多个客户端状态被服务器用链表连接起来。 */typedef struct redisClient { // 套接字描述符 int fd; // 当前正在使用的数据库 redisDb *db; // 当前正在使用的数据库的 id (号码) int dictid; // 客户端的名字 robj *name; /* As set by CLIENT SETNAME */ // 查询缓冲区 sds querybuf; // 查询缓冲区长度峰值 size_t querybuf_peak; /* Recent (100ms or more) peak of querybuf size */ // 参数数量 int argc; // 参数对象数组 robj **argv; // 记录被客户端执行的命令 struct redisCommand *cmd, *lastcmd; // 请求的类型:内联命令还是多条命令 int reqtype; // 剩余未读取的命令内容数量 int multibulklen; /* number of multi bulk arguments left to read */ // 命令内容的长度 long bulklen; /* length of bulk argument in multi bulk request */ // 回复链表 list *reply; // 回复链表中对象的总大小 unsigned long reply_bytes; /* Tot bytes of objects in reply list */ // 已发送字节,处理 short write 用 int sentlen; /* Amount of bytes already sent in the current buffer or object being sent. */ // 创建客户端的时间 time_t ctime; /* Client creation time */ // 客户端最后一次和服务器互动的时间 time_t lastinteraction; /* time of the last interaction, used for timeout */ // 客户端的输出缓冲区超过软性限制的时间 time_t obuf_soft_limit_reached_time; // 客户端状态标志 int flags; /* REDIS_SLAVE | REDIS_MONITOR | REDIS_MULTI ... */ // 当 server.requirepass 不为 NULL 时 // 代表认证的状态,用于记录客户端是否通过了身份验证 // 0 代表未认证, 1 代表已认证 int authenticated; /* when requirepass is non-NULL */ // 复制状态 int replstate; /* replication state if this is a slave */ // 用于保存主服务器传来的 RDB 文件的文件描述符 int repldbfd; /* replication DB file descriptor */ // 读取主服务器传来的 RDB 文件的偏移量 off_t repldboff; /* replication DB file offset */ // 主服务器传来的 RDB 文件的大小 off_t repldbsize; /* replication DB file size */ sds replpreamble; /* replication DB preamble. */ // 主服务器的复制偏移量 long long reploff; /* replication offset if this is our master */ // 从服务器最后一次发送 REPLCONF ACK 时的偏移量 long long repl_ack_off; /* replication ack offset, if this is a slave */ // 从服务器最后一次发送 REPLCONF ACK 的时间 long long repl_ack_time;/* replication ack time, if this is a slave */ // 主服务器的 master run ID // 保存在客户端,用于执行部分重同步 char replrunid[REDIS_RUN_ID_SIZE+1]; /* master run id if this is a master */ // 从服务器的监听端口号 int slave_listening_port; /* As configured with: SLAVECONF listening-port */ // 事务状态 multiState mstate; /* MULTI/EXEC state */ // 阻塞类型 int btype; /* Type of blocking op if REDIS_BLOCKED. */ // 阻塞状态 blockingState bpop; /* blocking state */ // 最后被写入的全局复制偏移量 long long woff; /* Last write global replication offset. */ // 被监视的键 list *watched_keys; /* Keys WATCHED for MULTI/EXEC CAS */ // 这个字典记录了客户端所有订阅的频道 // 键为频道名字,值为 NULL // 也即是,一个频道的集合 dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */ // 链表,包含多个 pubsubPattern 结构 // 记录了所有订阅频道的客户端的信息 // 新 pubsubPattern 结构总是被添加到表尾 list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */ sds peerid; /* Cached peer ID. */ /* Response buffer */ // 回复偏移量 int bufpos; // 回复缓冲区 char buf[REDIS_REPLY_CHUNK_BYTES];} redisClient;
2. 客户端的创建与关闭
客户端分为:普通客户端/伪客户端
(1)普通客户端
客户端使用connect函数连接到服务器时,服务器调用连接事件处理器为客户端创建相应的客户端状态,并将这个新的客户端状态添加到服务器状态结构clients链表末尾。
(2)Lua脚步的伪客户端
服务器会在初始化时创建执行Lua脚步中包含的redis命令的伪客户端,并将这个伪客户端关联在服务器状态结构的lua_client属性中:
struct redisServer{ //... redisClient *lua_client; //...};
lua_client伪客户端在服务器运行的整个生命期中会一直存在,只有服务器被关闭时,这个客户端才会被关闭。
(3)AOF文件的伪客户端
服务器载入AOF文件时,会创建用于执行AOF文件包含的redis命令的伪客户端,并在载入完成后关闭。
0 0
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 客户端
- 【JS】【客户端】客户端JavaScript
- 胖客户端、瘦客户端与智能客户端
- 胖客户端、瘦客户端和富客户端
- 客户端配置文件
- 智能客户端
- 客户端脚本
- 智能客户端
- 客户端基本信息
- 借助Gson解析Json的方法
- 序列式容器:vecor,stack,queue用法
- Hive基本操作
- 如何进行finetune
- hadoop 清空回收站
- 客户端
- OpenRTSP分析
- SystemServer vs ServiceManager
- redis与memcached
- Android5.0更新内容简介
- Ula的开篇
- POJ 2437 Muddy roads
- zookeeper学习
- 某软件公司的GUID生成代码(GUIDFactory)java+C#