1. Redis命令属性介绍


Redis的不同命令拥有不同的属性,如是否是只读命令,是否是管理员命令等,一个命令可以拥有多个属性。在一些特殊情况下不同属性的命令会有不同的表现。


下表归纳了一些常见的属性及其含义:

java redis hash 随机取值_redis




2.REDIS_CMD_SORT_FOR_SCRIPT命令的特点


为了对随机属性有更直观的理解,我们以KEYS为例:

在我们加入一个key之前,先查看Redis当前key*:

1) "DIK.2"
2) "VOL_my_t2"
3) "volume.47"
4) "DISK.18"
………….
73) "chap.2"
74) "CLONE_ID_NEXT"
75) "INITGRP_ID"
76) "snapshot.t1.1448"
77) "initGrp.4"


紧接着,加入一个key,再看看它的位置:

127.0.0.1:6379> set ALIBABA 1
127.0.0.1:6379> keys *
1) "DISK.2"
2) "VOLUMEINFO_my_t2"
3) "volume.47"
4) "DISK.18"
………….
74) "CLONE_ID_NEXT"
75) "ALIBABA"
76) "INITGRP_ID"
77) "snapshot.t1.1448"
78) "initGrp.4"



通过上面的示例,可以看大插入一个key之后,Redis会根据内部顺序把新插入的key放入到数据库里面,但用户不能根据任何顺序假定它的位置。


3.示例

理解了上面对REDIS_CMD_SORT_FOR_SCRIPT的特殊属性之后,就不难看出下面一段程序的问题:


reply         
          = redis_read(alert_con,           "HVALS %s"          , id_string);         
                    if         
          (reply == NULL) {         
                    LOGLIB_ERROR("%s:         
          Redis run HVALS error!\n", __FUNCTION__);         
                    ret         
          = -2;         
                    }         
          else           {         
                    ret         
          = reply->elements;         
                    if         
          (ret != MEMBER_ITEM_CNT - 1) {         
                    /*         
          not sure whther this checki is correct */         
                    printf         
                    ("%s:         
          HVLAS %s           return           %d fields, less than expection!\n",         
                    __FUNCTION__,         
          id_string, ret);         
                    ret         
          = -3;         
                    }         
          else           {         
                    ret         
          = 0;         
                    
                    /*         
          step 1.1: check whether returned value is number of field */         
                    
                    /*         
          step 1.2: Init the alert content with the returned value of above cmd         
          */         
                    alert->timestamp.tv_sec         
          =         
                    strtoul          ((          const         
          char           *) (reply->element[0]->str), &pstr, 0);         
                    alert->id         
          =           atoi          (reply->element[1]->str);         
                    alert->op         
          =           atoi          (reply->element[2]->str);         
                    alert->severity         
          =           atoi          (reply->element[3]->str);         
                    memcpy          (alert->description,         
          reply->element[4]->str,         
                    strlen          (reply->element[4]->str)         
          + 1);         
                    alert->category         
          =           atoi          (reply->element[5]->str);         
                    alert->comp         
          =           atoi          (reply->element[6]->str);         
                    alert->comp_id         
          =           atoi          (reply->element[7]->str);         
                    alert->type.val         
          =           atoi          (reply->element[8]->str);         
                    
                    sscanf          (reply->element[9]->str,         
          "%d"          , &alert->data[0]);         
                    sscanf          (reply->element[10]->str,         
          "%d"          , &alert->data[1]);         
                    
                    strcpy          (alert->name,         
          reply->element[11]->str);         
                    }         
                    }




上面的代码中Redis命令“HVALS”的属性是REDIS_CMD_SORT_FOR_SCRIPT,取到的键值对的顺序是随机的,需要用 “HMGET”来替代。


4.总结

在程序或者脚本中调用Redis一些命令的时候,务必注意所调用命令的属性,特别是像上面HVALS例子所显示的,否则可能出现非常奇怪但又不便检查和调试的现象。















本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1939241,如需转载请自行联系原作者