作者:老男孩2702938107 | 来源:互联网 | 2023-07-15 12:03
redis module相关的代码,类似map
#include "redismodule.h"#include void InfoFunc(RedisModuleInfoCtx *ctx, int for_crash_report) {RedisModule_InfoAddSection(ctx, "");RedisModule_InfoAddFieldLongLong(ctx, "global", -2);RedisModule_InfoAddFieldULongLong(ctx, "uglobal", (unsigned long long)-2);RedisModule_InfoAddSection(ctx, "Spanish");RedisModule_InfoAddFieldCString(ctx, "uno", "one");RedisModule_InfoAddFieldLongLong(ctx, "dos", 2);RedisModule_InfoAddSection(ctx, "Italian");RedisModule_InfoAddFieldLongLong(ctx, "due", 2);RedisModule_InfoAddFieldDouble(ctx, "tre", 3.3);RedisModule_InfoAddSection(ctx, "keyspace");RedisModule_InfoBeginDictField(ctx, "db0");RedisModule_InfoAddFieldLongLong(ctx, "keys", 3);RedisModule_InfoAddFieldLongLong(ctx, "expires", 1);RedisModule_InfoEndDictField(ctx);RedisModule_InfoAddSection(ctx, "unsafe");RedisModule_InfoBeginDictField(ctx, "unsafe:field");RedisModule_InfoAddFieldLongLong(ctx, "value", 1);RedisModule_InfoEndDictField(ctx);if (for_crash_report) {RedisModule_InfoAddSection(ctx, "Klingon");RedisModule_InfoAddFieldCString(ctx, "one", "wa’");RedisModule_InfoAddFieldCString(ctx, "two", "cha’");RedisModule_InfoAddFieldCString(ctx, "three", "wej");}}int info_get(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, char field_type)
{if (argc != 3 && argc != 4) {RedisModule_WrongArity(ctx);return REDISMODULE_OK;}int err = REDISMODULE_OK;const char *section, *field;section = RedisModule_StringPtrLen(argv[1], NULL);field = RedisModule_StringPtrLen(argv[2], NULL);RedisModuleServerInfoData *info = RedisModule_GetServerInfo(ctx, section);if (field_type=='i') {long long ll = RedisModule_ServerInfoGetFieldSigned(info, field, &err);if (err==REDISMODULE_OK)RedisModule_ReplyWithLongLong(ctx, ll);} else if (field_type=='u') {unsigned long long ll = (unsigned long long)RedisModule_ServerInfoGetFieldUnsigned(info, field, &err);if (err==REDISMODULE_OK)RedisModule_ReplyWithLongLong(ctx, ll);} else if (field_type=='d') {double d = RedisModule_ServerInfoGetFieldDouble(info, field, &err);if (err==REDISMODULE_OK)RedisModule_ReplyWithDouble(ctx, d);} else if (field_type=='c') {const char *str = RedisModule_ServerInfoGetFieldC(info, field);if (str)RedisModule_ReplyWithCString(ctx, str);} else {RedisModuleString *str = RedisModule_ServerInfoGetField(ctx, info, field);if (str) {RedisModule_ReplyWithString(ctx, str);RedisModule_FreeString(ctx, str);} elseerr=REDISMODULE_ERR;}if (err!=REDISMODULE_OK)RedisModule_ReplyWithError(ctx, "not found");RedisModule_FreeServerInfo(ctx, info);return REDISMODULE_OK;
}int info_gets(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {return info_get(ctx, argv, argc, 's');
}int info_getc(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {return info_get(ctx, argv, argc, 'c');
}int info_geti(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {return info_get(ctx, argv, argc, 'i');
}int info_getu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {return info_get(ctx, argv, argc, 'u');
}int info_getd(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {return info_get(ctx, argv, argc, 'd');
}int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {REDISMODULE_NOT_USED(argv);REDISMODULE_NOT_USED(argc);if (RedisModule_Init(ctx,"infotest",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR) return REDISMODULE_ERR;if (RedisModule_RegisterInfoFunc(ctx, InfoFunc) == REDISMODULE_ERR) return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"info.gets", info_gets,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"info.getc", info_getc,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"info.geti", info_geti,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"info.getu", info_getu,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"info.getd", info_getd,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;return REDISMODULE_OK;
}