博客

Redis源码阅读之lpush&rpush

August 4, 2024
Redis
Redis

Redis版本:7.0.2 Redis的lpush和rpush命令用于在list的头部和尾部添加元素。源码如下: /* LPUSH <key> <element> [<element> ...] */ void lpushCommand(client *c) { pushGenericCommand(c,LIST_HEAD,0); } /* RPUSH <key> <element> [<element> ...] */ void rpushCommand(client *c) { pushGenericCommand(c,LIST_TAIL,0); } 可以看到,这两个命令都调 ...

Redis源码阅读之zdel

June 25, 2024
Redis
Redis

Redis版本:7.0.2 zremCommand # zrem命令对应的函数为zremCommand,其定义如下: /***************t_zset.c****************/ void zremCommand(client *c) { robj *key = c->argv[1]; robj *zobj; int deleted = 0, keyremoved = 0, j; if ((zobj = lookupKeyWriteOrReply(c,key,shared.czero)) == NULL || checkType(c,zobj,OBJ_ZSET)) return; for (j = 2; j < c->argc; j++) { if (zsetDel(zobj,c->argv[j]->ptr)) deleted++; if (zsetLength(zobj) == 0) { dbDelete(c->db,key); keyremoved = ...

Redis源码阅读之sadd

June 23, 2024
Redis
Redis

Redis版本:7.0.2 入口-saddCommand函数 # sadd命令对应函数saddCommand,源码如下: void saddCommand(client *c) { robj *set; int j, added = 0; set = lookupKeyWrite(c->db,c->argv[1]); if (checkType(c,set,OBJ_SET)) return; if (set == NULL) { set = setTypeCreate(c->argv[2]->ptr); dbAdd(c->db,c->argv[1],set); } for (j = 2; j < c->argc; j++) { ...

Redis源码阅读之zadd

June 23, 2024
Redis
Redis

Redis版本:7.0.2 有序集合的定义 # 有序集合(zet)有两种不同的编码类型: 当元素数量较少且键的长度短时,使用listpack类型。 否则,使用跳表编码。这种情况下,zset使用了跳 ...

Redis源码阅读之hdel命令

June 22, 2024
Redis
Redis

Redis版本:7.0.2 hdelCommand # hdel命令对应的函数为hdelCommand,源码如下: /*****************t_hash.c********************/ void hdelCommand(client *c) { robj *o; int j, deleted = 0, keyremoved = 0; if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL || checkType(c,o,OBJ_HASH)) return; for (j = 2; j < c->argc; j++) { if (hashTypeDelete(o,c->argv[j]->ptr)) { deleted++; if (hashTypeLength(o) == 0) { dbDelete(c->db,c->argv[1]); keyremoved = 1; break; } } ...

Redis源码阅读之hget命令

June 22, 2024
Redis
Redis

Redis版本:7.0.2 hget命令对应的函数为hgetCommand,源码如下: ****************t_hash.c******************* void hgetCommand(client *c) { robj *o; if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.null[c->resp])) == NULL || checkType(c,o,OBJ_HASH)) return; addHashFieldToReply(c, o, c->argv[2]->ptr); } static void addHashFieldToReply(client *c, robj *o, sds field) { if (o == NULL) { addReplyNull(c); return; } unsigned char *vstr = NULL; unsigned int vlen = UINT_MAX; long long vll = ...

Redis源码阅读之hset命令

June 22, 2024
Redis
Redis

Redis版本:7.0.2 hset命令对应函数hsetCommand,位于t_hash.c文件中,源码如下: void hsetCommand(client *c) { int i, created = 0; robj *o; if ((c->argc % 2) == 1) { addReplyErrorArity(c); return; } if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; hashTypeTryConversion(o,c->argv,2,c->argc-1); for (i = 2; i < c->argc; i += 2) ...

Redis源码阅读之渐进式rehash

June 22, 2024
Redis
Redis

Redis版本:7.0.2 在哈希表扩容或缩容时,如果一次迁移完所有数据,可能会导致性能阻塞问题。为了避免出现这种情况,Redis采用了渐进式 rehash的方式,将rehash操作分为多次 ...

Redis源码阅读之del命令

June 20, 2024
Redis
Redis

redis版本:7.0.2 delCommand位于db.c文件,函数定义如下: /* This command implements DEL and LAZYDEL. */ void delGenericCommand(client *c, int lazy) { int numdel = 0, j; for (j = 1; j < c->argc; j++) { expireIfNeeded(c->db, c->argv[j], 0); int deleted = lazy ? dbAsyncDelete(c->db, c->argv[j]) : dbSyncDelete(c->db, c->argv[j]); if (deleted) { signalModifiedKey(c, c->db, c->argv[j]); notifyKeyspaceEvent(NOTIFY_GENERIC, "del", c->argv[j], c->db->id); server.dirty++; numdel++; } ...

Redis源码阅读之set命令

June 19, 2024
Redis, 数据库
Redis

redis版本:7.0.2 函数setGenericCommand,对应文件是t_string.c,源码如下: /* The setGenericCommand() function implements the SET operation with different * options and variants. This function is called in order to implement the * following commands: SET, SETEX, PSETEX, SETNX, GETSET. * setGene ...