redis源码修改之zincrby,hincrby命令

在项目中大量使用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},

。。。

{"zincrby",zincrbyCommand,4,REDIS_CMD_DENYOOM,NULL,1,1,1}

}

这个版本和2.6以上版本命令参数有不同,但是前几个参数都是一致的,第一个表示命令关键字,第二个表示函数名,第三个表示输入参数个数,正数表示参数数只能等于,负数表示参数个数至少等于。

由于zincrby命令指定的参数是4,看了一下后续的实现代码,发现里面当参数大于4的时候也进行了处理,于是将4改为-4,然后make,进行测试。

{"zincrby",zincrbyCommand,-4,REDIS_CMD_DENYOOM,NULL,1,1,1}

运行如下:

其实源码修改很简单,就修改了一个参数,其他的都没动,和原来想的差很多,不过目的达到了。

redis源码修改之zincrby,hincrby命令,布布扣,bubuko.com

时间: 2024-10-03 13:46:21

redis源码修改之zincrby,hincrby命令的相关文章

redis源码分析(1)--makefile和目录结构分析

一.redis源码编译 redis可以直接在官网下载(本文使用版本 3.0.7):https://redis.io/download 安装: $ tar xzf redis-3.0.7.tar.gz $ cd redis-3.0.7 $ make make执行以后主要编译产物在src/redis-server src/redis-cli 如果想把redis-server直接install到可执行目录/usr/local/bin,还需要执行: $ make install Run Redis wi

Redis源码解析:15Resis主从复制之从节点流程

Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡. 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(commandpropagate)两个操作: 同步操作用于将从节点的数据库状态更新至主节点当前所处的数据库状态: 命令传播操作则用于在主节点的数据库状态被修改,导致主从节点的数据库状态不一致时,让主从节点的数据库重新回到一致状态: 1:同步 当客户端向从节点发送SLAYEOF命令,或者从节点的配置文件中配置了

redis源码解析之事件驱动

Redis 内部有个小型的事件驱动,它主要处理两项任务: 文件事件:使用I/O多路复用技术处理多个客户端请求,并返回执行结果. 时间事件:维护服务器的资源管理,状态检查. 主要的数据结构包括文件事件结构体,时间事件结构体,触发事件结构体,事件循环结构体 /* File event structure */ typedef struct aeFileEvent { int mask; /* one of AE_(READABLE|WRITABLE) */ aeFileProc *rfileProc

Redis源码学习:字符串

Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串,还用来当做缓冲区,例如AOF缓冲区或输入缓冲区等.如下所示,整数len和free分别表示buf数组中已使用的长度和剩余可用的长度,buf是一个原生C字符串,以\0结尾. sds就是sdshdr中char buf[]的别名,后面能看到,各种操作函数的入参和返回值都是sds而非sdshdr.那sdshd

Redis源码解析:13Redis中的事件驱动机制

Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的. Redis中的事件驱动库只关注网络IO,以及定时器.该事件库处理下面两类事件: a:文件事件(file  event):用于处理Redis

【Redis源码剖析】 - Redis之数据库redisDb

原创作品,转载请标明:http://blog.csdn.net/xiejingfa/article/details/51321282 今天,我们来讨论两点内容:一是Redis是如何存储类型对象的,二是Redis如何实现键的过期操作. 本文介绍的内容主要涉及db.c和redis.h两个文件. 1.redisDb介绍 Redis中存在"数据库"的概念,该结构由redis.h中的redisDb定义.我们知道Redis提供string.list.set.zset.hash五种数据类型的存储,在

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一.redis事务核心命令简介 redis事务操作核心命令: //用于开启事务 {"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0}, //用来执行事

Redis源码阅读(二)高可用设计——复制

Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致. 使用场景:复制机制很实用,在客户端并发访问量很大,单台Redis扛不住的情况下,可以部署多台Redis复制相同的数据,共同对外提供服务,提高Redis并发访问处理能力.当然这种通过复制方式部署多台Redis以提高并发处理能力的方式只适用于客户端大部分访问为读数据请求的场景.此外,Redis从2.

Redis源码安装for centos7

本文源链接地址:https:www.93bok.com Redis概述 Redis的出现时间并不长,是NoSQL中的一种,基于键-值型的存储,与Memcache类似,但是Memcache中只是内存的缓存,而Redis不仅是内存中的缓存,还提供持久存储,在2009年第一次发布Redis Redis 全称(REmote DIctionary Server)远程字典服务器,而这个字典服务器从本质上来讲,主要是提供数据结构的远程存储功能的,可以理解为Redis是一个高级的K-V存储,和数据结构存储,因为