redis 数据库实现

数据库的 server 端和 client 端

  • redisClient 结构

  • redis 数据库实例结构

  • 对数据进行操作过程中, 还掺杂着一些其他的操作

  • 过期删除策略

    数据库通知

    db api (src/db.c)

    lookupKey从 db 中取出指定 key 的值对象robj *lookupKey(redisDb *db, robj *key)
    lookupKeyRead为执行读操作从 db 中取出指定 key 的值, 相对于 lookupKey 来说, 增加了判断 key 是否过期以及更新缓存命中/未命中信息robj *lookupKeyRead(redisDb *db, robj *key)
    lookupKeyWrite为执行写操作从 db 中取出指定 key 的值, 相对于 lookupKeyRead 来说, 不会更新缓存命中信息robj *lookupKeyWrite(redisDb *db, robj *key)
    lookupKeyReadOrReply为执行读操作从 db 中取出指定 key 的值, 若未找到, 则向客户端发送 reply 信息robj *lookupKeyReadOrReply(redisClient *c, robj *key, robj *reply)
    lookupKeyWriteOrReply为执行写操作从 db 中取出指定 key 的值, 若未找到, 则向客户端发送 reply 信息robj *lookupKeyWriteOrReply(redisClient *c, robj *key, robj *reply)
    doAdd向 db 添加键值对void dbAdd(redisDb *db, robj *key, robj *val)
    doOverwrite修改 db 中指定 key 的值void dbOverwrite(redisDb *db, robj *key, robj *val)
    setKeyset 命令, 设置 db 中指定 key 的值, 若存在, 则覆盖, 若不存在, 则新增, 会移除 key 的过期时间void setKey(redisDb *db, robj *key, robj *val)
    dbExists判断 db 中指定的 key 是否存在int dbExists(redisDb *db, robj *key)
    dbRandomKey从 db 中获取随机的一个 keyrobj *dbRandomKey(redisDb *db)
    dbDelete删除 db 中指定 key 的键值对数据以及键的过期时间int dbDelete(redisDb *db, robj *key)
    dbUnshareStringValue
    emptyDb清空所有 db 的数据long long emptyDb(void(callback)(void*))
    selectDb将客户端的 db 指向 id 指定的数据库int selectDb(redisClient *c, int id)
    signalModifiedKey每当 db 中的键被改动时, 此函数均会调用, 通知监视这个键的客户端void signalModifiedKey(redisDb *db, robj *key)
    signalFlushedDb每当清空一个 db 时, 此函数均会调用, 通知相关客户端void signalFlushedDb(int dbid)
    removeExpire移除指定 key 的过期时间int removeExpire(redisDb *db, robj *key)
    setExpire设置指定 key 的过期时间为 whenvoid setExpire(redisDb *db, robj *key, long long when)
    getExpire获取指定 key 的过期时间long long getExpire(redisDb *db, robj *key)
    propagateExpire若一个 key 在主节点已过期, 删除从节点以及 aof 文件中的此 key, 构造 del 命令并调用void propagateExpire(redisDb *db, robj *key)
    expireIfNeeded检查给定 key 是否过期, 若过期, 视情况判断是否删除: 服务器正在载入不删除, 从库不删除int expireIfNeeded(redisDb *db, robj *key)
    getKeysUsingCommandTable获取命令中的所有 keyint *getKeysUsingCommandTable(struct redisCommand *cmd,robj **argv, int argc, int *numkeys)
    getKeysFromCommand从命令中获取键, 相对于 getKeysUsingCommandTable, 多了集群转向时的支持int *getKeysFromCommand(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
    getKeysFreeResult释放 getKeysFromCommand 的结果void getKeysFreeResult(int *result)
    slotToKeyAdd将给定 key 添加到槽中void slotToKeyAdd(robj *key)
    slotToKeyDel从槽中删除给定 keyvoid slotToKeyDel(robj *key)
    slotToKeyFlush清空所有槽保存的所有键void slotToKeyFlush(void)
    getKeysInSlot从 hashslot 槽中获取 count 个 keyunsigned int getKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count)
    delKeysInSlot删除 hashslot 槽中所有 keyunsigned int delKeysInSlot(unsigned int hashslot)
    countKeysInSlot返回指定 hashslot 槽中 key 的个数unsigned int countKeysInSlot(unsigned int hashslot)
    04-27 06:23