Redis源码分析(三十二)--- redis-cli.c客户端命令行接口的实现(1)

分析了将近1个月的Redis源代码了,也到了最核心的,最贴近系统开始的地方了,我把他取名为main目录,里面就包括了2个重要的文件,redis-cli和redis文件,1个代表的是客户端的执行文件,1个代表的是服务端的文件,这2个也是整个系统最最核心的模块,所以我把他归结到main主程序模块了,主程序模块也是我学习Redis最后的一个模块,在这里一定能看到我之前看到的所有各个功能模块的痕迹。由于主模块中的代码量比较多,所以我选择了分批次的学习,所以今天我主要的是把里面的API方法给拉了出来,把redis-cli中的东西,做了个解剖。

刚开始以为redis-cli.是redis-client的缩写,但其实他的意思:

/* Redis CLI (command line interface)
 * 命令行接口

所以说,他是直接响应操作redis下的黑窗口的命令的。在这个文件中,定义了redis的上下文,配置信息结构体和一堆的API,就大致这些了:

/* redis上下文 */
static redisContext *context;
/* Redis配置结构体 */
static struct config

主要是后面的各种API,先不急着看方法,因为方法真的是太多了,首先我们学会分类:下面是我做的一个图;

模块还是挺多的吧上面都是英文的表现形式,在后续的分析中,我会逐个模块的做学习,比如第一个Utility functions就是通用方法的意思啦,还有后面的什么什么方法等。下面在放出redis-cli中的所有API:

/* Utility functions  通用方法 */
static long long ustime(void)
static long long mstime(void)
static void cliRefreshPrompt(void)
static sds cliVersion(void)
static void cliInitHelp(void)
static void cliOutputCommandHelp(struct commandHelp *help, int group)
static void cliOutputGenericHelp(void)
static void cliOutputHelp(int argc, char **argv)
static void completionCallback(const char *buf, linenoiseCompletions *lc)
static int cliAuth()
static int cliSelect()
static int cliConnect(int force)
static void cliPrintContextError(void)
static sds cliFormatReplyTTY(redisReply *r, char *prefix)
static sds cliFormatReplyRaw(redisReply *r)
static sds cliFormatReplyCSV(redisReply *r)
static int cliReadReply(int output_raw_strings)
static int cliSendCommand(int argc, char **argv, int repeat)
static redisReply *reconnectingInfo(void)

/* User interface 用户接口*/
static int parseOptions(int argc, char **argv)
static sds readArgFromStdin(void)
static void usage(void)
static char **convertToSds(int count, char** args)
static void repl(void)
static int noninteractive(int argc, char **argv)

/* Eval mode Eval模式*/
static int evalMode(int argc, char **argv)

/* Latency and latency history modes 延时模式*/
static void latencyMode(void)

/* Slave mode */
unsigned long long sendSync(int fd)
static void slaveMode(void)

/* RDB transfer mode */
static void getRDB(void)

/* Bulk import (pipe) mode */
static void pipeMode(void)

/* Find big keys */
static redisReply *sendScan(unsigned long long *it)
static int getDbSize(void)
static int toIntType(char *key, char *type)
static void getKeyTypes(redisReply *keys, int *types)
static void getKeySizes(redisReply *keys, int *types, unsigned long long *sizes)
static void findBigKeys(void)

/* Stats mode */
static char *getInfoField(char *info, char *field)
static long getLongInfoField(char *info, char *field)
void bytesToHuman(char *s, long long n)
static void statMode(void)

/* Scan mode */
static void scanMode(void)

/* Intrisic latency mode*/
unsigned long compute_something_fast(void)
static void intrinsicLatencyModeStop(int s)
static void intrinsicLatencyMode(void)

/* Program main() */
int main(int argc, char **argv)
时间: 2024-10-07 18:53:45

Redis源码分析(三十二)--- redis-cli.c客户端命令行接口的实现(1)的相关文章

ABP源码分析三十二:ABP.SignalR

Realtime Realtime是ABP底层模块提供的功能,用于管理在线用户.它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在线用户的信息 OnlineClientManager/IOnlineClientManager: 用于提供基本维护在线用户的方法.其内部维护了一个字典来保存在线的客户信息. SingalR SignalRRealTimeNotifier: 实现了给在线用户发送通知的功能.其从IOnlineClien

Redis源码分析(十二)--- redis-check-dump本地数据库检测

这个文件我在今天分析学习的时候,一直有种似懂非懂的感觉,代码量700+的代码,最后开放给系统的就是一个process()方法.这里说的说的数据库检测,是针对key的检测,会用到,下面提到的结构体: /* Data type to hold opcode with optional key name an success status */ /* 用于key的检测时使用,后续检测操作都用到了entry结构体 */ typedef struct { //key的名字 char* key; //类型

ABP源码分析三十:ABP.RedisCache

ABP 通过StackExchange.Redis类库来操作Redis数据库. AbpRedisCacheModule:完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRedisCacheConfig:定义了connectionStringKey和databaseIdAppSetting的值.这两个值对象redis 在web.config中的key值. ABP.RedisCache模块通过读取web.config来获取redis的配置. IAbpRedisConnect

Redis源码分析(一)--Redis结构解析

从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望最终能把他啃完吧,C语言好久不用,快忘光了.分析源码的第一步,先别急着想着从哪开始看起,先浏览一下源码结构,可以模块式的渐入,不过比较坑爹的是,Redis的源码全部放在在里面的src目录里,一下90多个文件统统在里面了,所以我选择了拆分,按功能拆分,有些文件你看名字就知道那是干什么的.我拆分好后的而结果如下: 11个包,这样每

ABP源码分析三十五:ABP中动态WebAPI原理解析

动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能,这应该算是对DRY的最佳诠释了. 如下图所示,一行代码就为所有实现了IApplicationService的类型,自动创建对应的动态WebAPI. 这么Magic的功能是如何实现的呢? 本文为你揭开其Magic的外表.你会发现,实现如此Magic的功能,最关键的代码只有四行. 先思考一个问题:如果不

ABP源码分析三十六:ABP.Web.Api

这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net webApi. AbpApiController:这是一个抽象基类,继承自ApiController,是AB WebApi系统中所有controller的基类.如下图中,其封装了ABP核心模块中提供的大多数的功能对象.同时实现了一些公共的方法.它有四个派生类:DynamicApiController<

Redis源码分析(十八)--- db.c内存数据库操作

我们知道Redis数据库作为一个内存数据库,与memcached比较类似,基本的操作都是存储在内存缓冲区中,等到缓冲区中数据满后,在持久化到磁盘中.今天,我主要研究了对于redis中对于内存数据库的操作.与普通的数据操作比较,并没有什么特别多的其他的一些操作.下面是我分类出的一些API: /*----------------------------------------------------------------------------- * C-level DB API *-------

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一.redis事务核心命令简介 redis事务操作核心命令: //用于开启事务 {"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0}, //用来执行事

redis源码分析3---结构体---字典

redis源码分析3---结构体---字典 字典,简单来说就是一种用于保存键值对的抽象数据结构: 注意,字典中每个键都是独一无二的:在redis中,内部的redis的数据库就是使用字典作为底层实现的: 1 字典的实现 在redis中,字典是使用哈希表作为底层实现的,一个hash表里面可以有多个hash表节点,而每个hash表节点就保存了字典中的一个键值对: hash表定义 table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值