1,redis核心对象结构
1)Redis object对象的
数据结构
,定义在src/server.h
中。
//redis对象再内部广泛使用
typedef struct redisObject {
unsigned type:4;//Basically this structure can represent all the basic Redis data types like strings, lists, sets, sorted sets and so forth.
unsigned encoding:4;
unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;//引用数
void *ptr;
} robj;
2)client、redisServer对象,定义在
src/server.h
中。
struct client {
int fd;// Client socket.
sds querybuf;//Buffer we use to accumulate client queries.
int argc;//当前命令的参数个数
robj **argv;//当前命令redisObject对象
redisDb *db;//当前选择的db
int flags;
user *user;//connection关联的用户
list *reply;//List of reply objects to send to the client.
char buf[PROTO_REPLY_CHUNK_BYTES];//Response buffer
char slave_ip[NET_IP_STR_LEN];//slave ip
... many other fields ...
}
struct redisServer {
/* General */
pid_t pid; /* Main process pid. */
redisDb *db;
dict *commands; /* Command table */
/* Networking */
int port; /* TCP listening port */
int tcp_backlog; /* TCP listen() backlog */
list *clients; /* List of active clients */
list *slaves, *monitors; /* List of slaves and MONITORs */
}
3)
server.c main
redis主方法
initServerConfig()
初始化redisServer数据结构
initServer()
分配需要操作的数据结构、设置socket监听
aeMain()
开启event loop,接受新连接。
serverCron()
:serverCron 每秒运行 10 次。
更新服务器的各类统计信息
清理过期键值对
关闭和清理连接失效的客户端
尝试进行 AOF 或 RDB 持久化操作
4)networking.c
负责与clients的I/O
createClient()
分配、初始化新的client
writeToClient()
Write data in output buffers to client.
readQueryFromClient()
将client数据读到query buffer中。
2,redisObject对象详解
1)位段结构定义属性。
是以bit为单位来定义结构体(或联合体)中的成员变量所占的空间。
unsigned type:4;
位段type,占4位
2)type:对应了5中redis基本数据类型
3)encoding:对应了11中编码方式(如String、Hash、Zset内部有多种表示方式,可以使用object encoding命令查看)