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) |
setKey | set 命令, 设置 db 中指定 key 的值, 若存在, 则覆盖, 若不存在, 则新增, 会移除 key 的过期时间 | void setKey(redisDb *db, robj *key, robj *val) |
dbExists | 判断 db 中指定的 key 是否存在 | int dbExists(redisDb *db, robj *key) |
dbRandomKey | 从 db 中获取随机的一个 key | robj *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 的过期时间为 when | void 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 | 获取命令中的所有 key | int *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 | 从槽中删除给定 key | void slotToKeyDel(robj *key) |
slotToKeyFlush | 清空所有槽保存的所有键 | void slotToKeyFlush(void) |
getKeysInSlot | 从 hashslot 槽中获取 count 个 key | unsigned int getKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count) |
delKeysInSlot | 删除 hashslot 槽中所有 key | unsigned int delKeysInSlot(unsigned int hashslot) |
countKeysInSlot | 返回指定 hashslot 槽中 key 的个数 | unsigned int countKeysInSlot(unsigned int hashslot) |