redis 返回值型別 和 rername-command相關內容

九州征途發表於2016-10-16

在redis原始碼目錄redis-3.2.2\deps\hiredis\hiredis.h 裡面定義了redis命令的返回值型別

#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3
#define REDIS_REPLY_NIL 4
#define REDIS_REPLY_STATUS 5
#define REDIS_REPLY_ERROR 6 

redis-cli 程式碼裡面輸出返回值的幾個函式分別是

static sds cliFormatReplyTTY(redisReply *r, char *prefix);

static sds cliFormatReplyRaw(redisReply *r)

static sds cliFormatReplyCSV(redisReply *r)

三個靜態函式 

比較常見的返回值型別是string型別 int型別 

還有一種型別 list型別的 函式裡面用了遞迴查詢的方法

 case REDIS_REPLY_ARRAY:
        if (r->elements == 0) {
            out = sdscat(out,"(empty list or set)\n");
        } else {
            unsigned int i, idxlen = 0;
            char _prefixlen[16];
            char _prefixfmt[16];
            sds _prefix;
            sds tmp;


            /* Calculate chars needed to represent the largest index */
            i = r->elements;
            do {
                idxlen++;
                i /= 10;
            } while(i);


            /* Prefix for nested multi bulks should grow with idxlen+2 spaces */
            memset(_prefixlen,' ',idxlen+2);
            _prefixlen[idxlen+2] = '\0';
            _prefix = sdscat(sdsnew(prefix),_prefixlen);


            /* Setup prefix format for every entry */
            snprintf(_prefixfmt,sizeof(_prefixfmt),"%%s%%%ud) ",idxlen);


            for (i = 0; i < r->elements; i++) {
                /* Don't use the prefix for the first element, as the parent
                 * caller already prepended the index number. */
                out = sdscatprintf(out,_prefixfmt,i == 0 ? "" : prefix,i+1);


                /* Format the multi bulk entry */
                tmp = cliFormatReplyTTY(r->element[i],_prefix);
                out = sdscatlen(out,tmp,sdslen(tmp));
                sdsfree(tmp);
            }
            sdsfree(_prefix);
        }
    break;

考慮到命令可能有多組資料  一層一層的去獲取資料

涉及到一些問題

比如 我們呼叫一個C的介面執行redis命令 列印除錯資訊一定要知道這個redisReply  這個結構體的意思 否則會引起記憶體錯誤

        reply=redisCommand(c,command); 

  printf("%s\n",reply->str);

        如果reply->str是個空指標會記憶體錯誤

舉個例子 command如果是 config get maxmemory 的時候 返回的是個資料集 這樣去列印reply->str的時候就會報記憶體錯誤了 

資料集的值是儲存

   

	/* This is the reply object returned by redisCommand() */
typedef struct redisReply {
    int type; /* REDIS_REPLY_* */
    long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
    int len; /* Length of string */
    char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
    size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
    struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
} redisReply;

這裡面的 element這個二級指標裡面

我們如果取資料 需要printf("%s\n",reply->elment[i]->str); 這樣才能取出資料

二、rename 相關

redis提供對命令重命令的功能

rename-command SET b840fc02d524045429941cc15f59e41cb7be6c51

這是官方提供的例子

rename把命令替換成一個字串  (特別注意字串必須用字母開頭 不能使用數字)

相關文章