| 6674 | } |
| 6675 | |
| 6676 | static void getKeyFreqs(redisReply *keys, unsigned long long *freqs) { |
| 6677 | redisReply *reply; |
| 6678 | unsigned int i; |
| 6679 | |
| 6680 | /* Pipeline OBJECT freq commands */ |
| 6681 | for(i=0;i<keys->elements;i++) { |
| 6682 | const char* argv[] = {"OBJECT", "FREQ", keys->element[i]->str}; |
| 6683 | size_t lens[] = {6, 4, keys->element[i]->len}; |
| 6684 | redisAppendCommandArgv(context, 3, argv, lens); |
| 6685 | } |
| 6686 | |
| 6687 | /* Retrieve freqs */ |
| 6688 | for(i=0;i<keys->elements;i++) { |
| 6689 | if(redisGetReply(context, (void**)&reply)!=REDIS_OK) { |
| 6690 | sds keyname = sdscatrepr(sdsempty(), keys->element[i]->str, keys->element[i]->len); |
| 6691 | fprintf(stderr, "Error getting freq for key '%s' (%d: %s)\n", |
| 6692 | keyname, context->err, context->errstr); |
| 6693 | sdsfree(keyname); |
| 6694 | exit(1); |
| 6695 | } else if(reply->type != REDIS_REPLY_INTEGER) { |
| 6696 | if(reply->type == REDIS_REPLY_ERROR) { |
| 6697 | fprintf(stderr, "Error: %s\n", reply->str); |
| 6698 | exit(1); |
| 6699 | } else { |
| 6700 | sds keyname = sdscatrepr(sdsempty(), keys->element[i]->str, keys->element[i]->len); |
| 6701 | fprintf(stderr, "Warning: OBJECT freq on '%s' failed (may have been deleted)\n", keyname); |
| 6702 | sdsfree(keyname); |
| 6703 | freqs[i] = 0; |
| 6704 | } |
| 6705 | } else { |
| 6706 | freqs[i] = reply->integer; |
| 6707 | } |
| 6708 | freeReplyObject(reply); |
| 6709 | } |
| 6710 | } |
| 6711 | |
| 6712 | #define HOTKEYS_SAMPLE 16 |
| 6713 | static void findHotKeys(void) { |
no test coverage detected