A module using only the low level zset API can easily arrive at empty keys - an unheard of thing in Redis. Of course, the author could always check the size of the zset after zrem, and delete the key if it is 0... yuck.
@antirez @dvirsky Unless I'm doing something wrong, I think this needs to be handled by Redis.
P.S. This quote is so funny :)
Empty keys will be handled correctly by doing nothing.
Minimal reproducible code example (starting to implement ZPOP):
#include "redismodule.h"
int test(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModuleKey *key = RedisModule_OpenKey(ctx, argv[1], REDISMODULE_READ | REDISMODULE_WRITE);
int type = RedisModule_KeyType(key);
if (REDISMODULE_KEYTYPE_EMPTY == type) {
RedisModule_CloseKey(key);
RedisModule_ReplyWithNull(ctx);
return REDISMODULE_OK;
}
if (REDISMODULE_KEYTYPE_ZSET != type)
{
RedisModule_CloseKey(key);
RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);
return REDISMODULE_OK;
}
RedisModule_ZsetFirstInScoreRange(key, REDISMODULE_NEGATIVE_INFINITE, REDISMODULE_POSITIVE_INFINITE, 0, 0);
RedisModuleString *ele = RedisModule_ZsetRangeCurrentElement(key, NULL);
RedisModule_ZsetRangeStop(key);
int deleted;
RedisModule_ZsetRem(key, ele, &deleted);
RedisModule_CloseKey(key);
RedisModule_ReplyWithString(ctx, ele);
return REDISMODULE_OK;
}
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argv);
REDISMODULE_NOT_USED(argc);
if (RedisModule_Init(ctx,"module",1,REDISMODULE_APIVER_1)
== REDISMODULE_ERR) return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test",
test,"write",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
return REDISMODULE_OK;
}
Terminal session:
127.0.0.1:6379> TYPE z
none
127.0.0.1:6379> TEST z
(nil)
127.0.0.1:6379> ZADD z 0 a 1 b
(integer) 2
127.0.0.1:6379> TYPE z
zset
127.0.0.1:6379> TEST z
"a"
127.0.0.1:6379> TYPE z
zset
127.0.0.1:6379> TEST z
"b"
127.0.0.1:6379> TYPE z
zset
127.0.0.1:6379> ZCARD z
(integer) 0
127.0.0.1:6379> EXISTS z
(integer) 1
127.0.0.1:6379> TEST z
Could not connect to Redis at 127.0.0.1:6379: Connection refused