Redis 5种数据类型与11种编码方式

2019-04-25  本文已影响0人  沐兮_d64c

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 mainredis主方法
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基本数据类型

image.png
3)encoding:对应了11中编码方式(如String、Hash、Zset内部有多种表示方式,可以使用object encoding命令查看)
image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读