• Redis源码研究--redis.h


    ------------7月3日------------

     1 /* The redisOp structure defines a Redis Operation, that is an instance of
     2  * a command with an argument vector, database ID, propagation target
     3  * (REDIS_PROPAGATE_*), and command pointer.
     4  *
     5  * Currently only used to additionally propagate more commands to AOF/Replication
     6  * after the propagation of the executed command. */
     7 typedef struct redisOp {
     8     robj **argv;
     9     int argc, dbid, target;
    10     struct redisCommand *cmd;
    11 } redisOp;

    argc 参数个数,argv参数数组,跟main函数里的参数一样

    dbid,数据库id,target(propagation传播),暂时不懂。

    cmd操作命令。

     ------------7月4日--------------------

     1 struct redisCommand {
     2     char *name;
     3     redisCommandProc *proc;
     4     int arity;
     5     char *sflags; /* Flags as string representation, one char per flag. */
     6     int flags;    /* The actual flags, obtained from the 'sflags' field. */
     7     /* Use a function to determine keys arguments in a command line.
     8      * Used for Redis Cluster redirect. */
     9     redisGetKeysProc *getkeys_proc;
    10     /* What keys should be loaded in background when calling this command? */
    11     int firstkey; /* The first argument that's a key (0 = no keys) */
    12     int lastkey;  /* The last argument that's a key */
    13     int keystep;  /* The step between first and last key */
    14     long long microseconds, calls;
    15 };

     给两三个例子就能懂一点,自己看代码

     1 void getCommand(redisClient *c);
     2 void lsetCommand(redisClient *c);
     3 void saddCommand(redisClient *c);
     4 
     5 {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
     6 {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},
     7 {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0}
     8 
     9 /* Our command table.
    10  *
    11  * Every entry is composed of the following fields:
    12  *
    13  * name: a string representing the command name.
    14  * function: pointer to the C function implementing the command.
    15  * arity: number of arguments, it is possible to use -N to say >= N
    16  * sflags: command flags as string. See below for a table of flags.
    17  * flags: flags as bitmask. Computed by Redis using the 'sflags' field.
    18  * get_keys_proc: an optional function to get key arguments from a command.
    19  *                This is only used when the following three fields are not
    20  *                enough to specify what arguments are keys.
    21  * first_key_index: first argument that is a key
    22  * last_key_index: last argument that is a key
    23  * key_step: step to get all the keys from first to last argument. For instance
    24  *           in MSET the step is two since arguments are key,val,key,val,...
    25  * microseconds: microseconds of total execution time for this command.
    26  * calls: total number of calls of this command.
    27  *
    28  * The flags, microseconds and calls fields are computed by Redis and should
    29  * always be set to zero.
    30  *
    31  * Command flags are expressed using strings where every character represents
    32  * a flag. Later the populateCommandTable() function will take care of
    33  * populating the real 'flags' field using this characters.
    34  *
    35  * This is the meaning of the flags:
    36  *
    37  * w: write command (may modify the key space).
    38  * r: read command  (will never modify the key space).
    39  * m: may increase memory usage once called. Don't allow if out of memory.
    40  * a: admin command, like SAVE or SHUTDOWN.
    41  * p: Pub/Sub related command.
    42  * f: force replication of this command, regardless of server.dirty.
    43  * s: command not allowed in scripts.
    44  * R: random command. Command is not deterministic, that is, the same command
    45  *    with the same arguments, with the same key space, may have different
    46  *    results. For instance SPOP and RANDOMKEY are two random commands.
    47  * S: Sort command output array if called from script, so that the output
    48  *    is deterministic.
    49  * l: Allow command while loading the database.
    50  * t: Allow command while a slave has stale data but is not allowed to
    51  *    server this data. Normally no command is accepted in this condition
    52  *    but just a few.
    53  * M: Do not automatically propagate the command on MONITOR.
    54  * k: Perform an implicit ASKING for this command, so the command will be
    55  *    accepted in cluster mode if the slot is marked as 'importing'.
    56  */

    很明显,redisCommandProc是个函数指针,

    typedef void redisCommandProc(redisClient *c);

     --------------7月5日----------------------

    还是说上面的命令吧

    {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},

    命令名字叫get,具体实现在getCommand里面,参数有两个(包括get?get name),模式为只读(
    will never modify the key space)。 
    {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},
    命令名字叫lset,具体实现在lsetCommand函数,参数有4个(lset mylist 3 “juan”),模式为写,会使用内存(
    may increase memory usage once called. Don't allow if out of memory)。

    -----------------7月10日----------------------
    redisServer里有个aeEventLoop,牵涉到Redis的事件。
    Redis事件分两种:

    1. 处理文件事件:在多个客户端中实现多路复用,接受它们发来的命令请求,并将命令的执行结果返回给客户端。
    2. 时间事件:实现服务器常规操作。
     1 /* Types and data structures */
     2 typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
     3 typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData);
     4 typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData);
     5 
     6 /* File event structure */
     7 typedef struct aeFileEvent {
     8     int mask; /* one of AE_(READABLE|WRITABLE) */
     9     aeFileProc *rfileProc;
    10     aeFileProc *wfileProc;
    11     void *clientData;
    12 } aeFileEvent;
    13 
    14 /* Time event structure */
    15 typedef struct aeTimeEvent {
    16     long long id; /* time event identifier. */
    17     long when_sec; /* seconds */
    18     long when_ms; /* milliseconds */
    19     aeTimeProc *timeProc;
    20     aeEventFinalizerProc *finalizerProc;
    21     void *clientData;
    22     struct aeTimeEvent *next;
    23 } aeTimeEvent;
  • 相关阅读:
    用户场景描述
    个人工作总结(第一阶段)
    个人进度报告
    《构建之法》阅读笔记05
    《构建之法》阅读笔记04
    《构建之法》阅读笔记03
    2020寒假学习(14)
    2020寒假学习(13)
    2020寒假学习(12)
    2020寒假学习(11)
  • 原文地址:https://www.cnblogs.com/feiyunruyue/p/3170667.html
Copyright © 2020-2023  润新知