1. Redis命令属性介绍


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


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

wKiom1lEg27SVHwEAAEDXKTCz80141.png




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例子所显示的,否则可能出现非常奇怪但又不便检查和调试的现象。