|
From 5304020683078273c1bc6cc9666dab95efa18607 Mon Sep 17 00:00:00 2001
From: luoxn28
<luoxn28@163.com>
Date: Fri,
30 Jun 2017 04:43:47 -0700
Subject: [PATCH] add own command: random num
--- src
/server.c | 3 ++- src
/server.h | 1 + src
/t_string.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/src/server.c b/src/server.c
index 609f396..e040104 100644
--- a/src/server.c
+++ b/src/server.c
@@ -296,7 +296,8 @@ struct redisCommand redisCommandTable[] = {
{"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0},
{"post",securityWarningCommand,-1,"lt",0,NULL,0,0,0,0,0},
{"host:",securityWarningCommand,-1,"lt",0,NULL,0,0,0,0,0},
- {"latency",latencyCommand,-2,"aslt",0,NULL,0,0,0,0,0}
+ {"latency",latencyCommand,-2,"aslt",0,NULL,0,0,0,0,0},
+ {"random",randomCommand,2,"rF",0,NULL,1,1,1,0,0}
};
struct evictionPoolEntry *evictionPoolAlloc(void);
diff --git a/src/server.h b/src/server.h
index 3fa7c3a..427ac92 100644
--- a/src/server.h
+++ b/src/server.h
@@ -1485,6 +1485,7 @@ void setnxCommand(client *c);
void setexCommand(client *c);
void psetexCommand(client *c);
void getCommand(client *c);
+void randomCommand(client *c);
void delCommand(client *c);
void existsCommand(client *c);
void setbitCommand(client *c);
diff --git a/src/t_string.c b/src/t_string.c
index 8c737c4..df4022d 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -173,6 +173,50 @@ void getCommand(client *c) {
getGenericCommand(c);
}
+static bool checkRandomNum(char *num)
+{
+ char *c = num;
+
+ while (*c != '\0') {
+ if (!(('0' <= *c) && (*c <= '9'))) {
+ return false;
+ }
+ c++;
+ }
+
+ return true;
+}
+
+/**
+ * command: random n
+ * return a random num < n, if n <= 0, return 0
+ * @author: luoxiangnan
+ */
+void randomCommand(client *c)
+{
+ char buff[64] = {0};
+ int num = 0;
+ robj *o = NULL;
+
+ if (!checkRandomNum(c->argv[1]->ptr)) {
+ o = createObject(OBJ_STRING, sdsnewlen("sorry, it's not a num :(",
+ strlen("sorry, it's not a num :(")));
+ addReplyBulk(c, o);
+ return;
+ }
+
+ sscanf(c->argv[1]->ptr, "%d", &num);
+ if (num > 0) {
+ num = random() % num;
+ } else {
+ num = 0;
+ }
+
+ sprintf(buff, "%s %d", "redis: ", num);
+ o = createObject(OBJ_STRING, sdsnewlen(buff, strlen(buff)));
+ addReplyBulk(c, o);
+}
+
void getsetCommand(client *c) {
if (getGenericCommand(c) == C_ERR) return;
c->argv[2] = tryObjectEncoding(c->argv[2]);
--
1.8.3.1 |
|