在项目中大量使用zincrby命令。究其原因是统计一些统计指标的日志值,和需要返回到顺序topn。
通常情况下,。调用一次的指示器zincrby(zincrby default:type 1 typeA) 它将能够正常工作。
情况是因为日志生成的太快,redis cpu利用率常常100%。并且还丢数据。
能否够一次性添加多次指标的累计值。比方zincrby default:type 1 typeA 1 typeB 1 typeC 。
。。
,这样将多次通信压缩到一次通信中,肯定能提高处理能力。
无奈 zincrby仅仅支持4个參数,redis官方文档上写的清楚:
ZINCRBY key increment member
所以,想到了改动redis(2.4.17)源代码来实现我自己的功能。
打开redis.c源代码文件能够到 redis的支持的命令表。 部分内容例如以下,
struct redisCommand readonlyCommandTable[] = {
{"get",getCommand,2,0,NULL,1,1,1},
{"set",setCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"setnx",setnxCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"setex",setexCommand,4,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"append",appendCommand,3,REDIS_CMD_DENYOOM,NULL,1,1,1},
{"strlen",strlenCommand,2,0,NULL,1,1,1},
{"set",setCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"setnx",setnxCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"setex",setexCommand,4,REDIS_CMD_DENYOOM,NULL,0,0,0},
{"append",appendCommand,3,REDIS_CMD_DENYOOM,NULL,1,1,1},
{"strlen",strlenCommand,2,0,NULL,1,1,1},
。。。
{"zincrby",zincrbyCommand,4,REDIS_CMD_DENYOOM,NULL,1,1,1}
}
这个版本号和2.6以上版本号命令參数有不同,可是前几个參数都是一致的,第一个表示命令keyword。第二个表示函数名。第三个表示输入參数个数,正数表示參数数仅仅能等于,负数表示參数个数至少等于。
因为zincrby命令指定的參数是4,看了一下兴许的实现代码,发现里面当參数大于4的时候也进行了处理。于是将4改为-4,然后make,进行測试。
{"zincrby",zincrbyCommand,-4,REDIS_CMD_DENYOOM,NULL,1,1,1}
执行例如以下:
事实上源代码改动非常easy,就改动了一个參数,其它在不变。而原本以为非常差,只有目的达到。
版权声明:本文博主原创文章,博客,未经同意不得转载。