摘要: 手写FTP服务器-C++实现FTP服务器 链接:https://gitee.com/hsby/xftp2 阅读全文
posted @ 2021-04-20 12:33 汉森伯逸 阅读(804) 评论(1) 推荐(0) 编辑
摘要: chapter22 二进制位数组 22.4 BITCOUNT命令的实现 遍历算法 查表算法 variable-precision SWAP算法 chapter23 慢查询日志 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度 服务器 阅读全文
posted @ 2021-04-20 11:47 汉森伯逸 阅读(44) 评论(0) 推荐(0) 编辑
摘要: chapter21 排序 21.1 SORT<key> 命令的实现 // 用于保存被排序值及其权重的结构 typedef struct _redisSortObject { // 被排序键的值 robj *obj; // 权重 union { // 排序数字值时使用 double score; // 阅读全文
posted @ 2021-04-20 11:45 汉森伯逸 阅读(47) 评论(0) 推荐(0) 编辑
摘要: chapter20 Lua脚本 Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端原子地执行多个Redis命令 20.1 创建并修改Lua环境 创建Lua环境 载入函数库 创建redis全局表格 20.2 Lua环境写作 阅读全文
posted @ 2021-04-20 11:44 汉森伯逸 阅读(49) 评论(0) 推荐(0) 编辑
摘要: chapter19 事务 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能 19.1 事务的实现 事务开始 redis> MULTI ok 通过切换客户端状态的flag属性的REDIS_MULTI标识来完成 命令入队 事务队列 struct redisServer{ // 事务状态 阅读全文
posted @ 2021-04-20 11:43 汉森伯逸 阅读(43) 评论(0) 推荐(0) 编辑
摘要: chapter18 发布与订阅 客户端订阅频道。 客户端向频道发送消息, 消息被传递至各个订阅者。 匹配模式 客户端订阅模式。 客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者。 另一个模式被匹配的例子。 18.1 频道的订阅与退订 struct redisServer{ /* Pubs 阅读全文
posted @ 2021-04-20 11:42 汉森伯逸 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 17.1 节点 启动节点 Redis服务器启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式 节点会继续使用redisServer结构来保存服务器的状态,使用redisClient结构来保存客户端的状态,至于那些集群模式下才会用到的数据结构,节点将它们保存到 阅读全文
posted @ 2021-04-20 11:41 汉森伯逸 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 16.1 启动并初始化Sentinel 初始化服务器 Sentinel本质上只是运行在特殊模式下的Redis服务器,启动第一步就是初始化一个普通的Redis服务器 使用Sentinel专用代码 使用redis.h/REDIS_SERVERPORT常量值作为服务器端口 使用redis.h/redisC 阅读全文
posted @ 2021-04-20 11:38 汉森伯逸 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 15.1 旧版复制功能的实现 同步 命令传播 旧版复制功能的缺陷 15.3 新版复制功能的实现 Redis2.8开始,使用PSYNC命令替代SYNC命令来执行复制时的同步操作 PSYNC命令具有完整重同步和部分重同步两种模式: 完整重同步与SYNC执行步骤基本相同 部分重同步用于处理断线后重复制情况 阅读全文
posted @ 2021-04-20 11:35 汉森伯逸 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 14.1 命令请求的执行过程 读取命令请求 命令执行器(1):查找命令实现 在命令表(command table)中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面 命令执行器(2):执行预备操作 14.2 serverCron函数 更新服务器时间缓存 struct redisS 阅读全文
posted @ 2021-04-20 11:34 汉森伯逸 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 服务器为每个客户端建立相应的redis.h/redisClient结构,这个结构保存了客户端当前的状态信息 客户端的套接字描述符 客户端的名字 客户端的标志值 只想客户端正在使用的数据库的指针,以及该数据库的号码 客户端当前要执行的命令、命令的参数、命令参数的个数,以及指向命令实现函数的指针 客户端 阅读全文
posted @ 2021-04-20 11:31 汉森伯逸 阅读(53) 评论(0) 推荐(0) 编辑
摘要: 12.1 文件事件 Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件时间处理器: 文件时间处理器使用IO多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不用的事件处理器 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写 阅读全文
posted @ 2021-04-20 11:30 汉森伯逸 阅读(55) 评论(0) 推荐(0) 编辑
摘要: 11.1 AOF持久化的实现 命令追加 当AOF持久化处于开启状态时,服务器执行完一个写命令之后,会以协议格式将被执行的写明了追加到服务器状态的aof_buf缓冲区 struct redisServers{ //... // AOF缓冲区 sds aof_buf; //... } AOF文件的写入与 阅读全文
posted @ 2021-04-20 11:29 汉森伯逸 阅读(39) 评论(0) 推荐(0) 编辑
摘要: chapter10 RDB持久化 10.1 RDB文件的创建和载入 有两个Redis命令可以用于生成RDB文件,SAVE和BGSAVE SAVE阻塞服务器进程进行RDB文件的创建,BGSAVE则创建服务器子进程进行RDB文件的创建 因为AOF文件的耿信频率通常比RDB文件的更新频率高,所以 如果服务 阅读全文
posted @ 2021-04-20 11:28 汉森伯逸 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 9.1 服务器中的数据库 Redis服务器将所有都保存在服务器状态redis.h/redisServer结构中 struct redisServer{ //... // 一个数组,保存着服务器中所有数据库 redisDb *db; //... } struct redisServer{ //... 阅读全文
posted @ 2021-04-20 11:27 汉森伯逸 阅读(50) 评论(0) 推荐(0) 编辑
摘要: 8.1 对象的类型与编码 Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性 typedef struct redisObject{ // 类型 unsigned type:4; // 编码 unsign 阅读全文
posted @ 2021-04-20 11:25 汉森伯逸 阅读(32) 评论(0) 推荐(0) 编辑
摘要: 恢复内容开始 2.1 SDS的定义 struct sdshdr{ // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度(不含'\0') int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; } 2. 阅读全文
posted @ 2021-04-20 11:24 汉森伯逸 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 事情是这样的,我在某个类中声明了一个静态的map成员, 文件名暂且称之为 xxx.h 然后在 xxx.cc 中全局定义了这个东西,静态成员在类里面只是声明,需要在外边被定义才有内存 然后又在main.cc中声明全局变量时间接调用了s_datas的find函数(它是个map),然后在windows上编 阅读全文
posted @ 2021-04-20 04:58 汉森伯逸 阅读(158) 评论(0) 推荐(0) 编辑