redis客户端与服务器
redis客户端与服务器客户端 cli命令行 typedef struct multiCmd { //参数 robj **argv; //参数数量 int argc; //命令指针 struct redisCommand *cmd; } multiCmd; client结构(直接对于所有的数据结构进行了解释) //I/O复用,所以需要为每个客户端维持一个状态,多个客户端在服务器用链表链接 typedef struct client { //client的id uint64_t id; /* Client incremental unique ID. */ connection *conn; //协议版本 int resp; /* RESP protocol version. Can be 2 or 3. */ //当前正在使用的数据库 redisDb *db; /* Pointer to currentl...
redis事件
redis事件数据结构//事件处理器状态(同时是时间处理器和文件处理器) typedef struct aeEventLoop { //当前注册的最大描述符 int maxfd; /* highest file descriptor currently registered */ //当前追踪的最大描述符 int setsize; /* max number of file descriptors tracked */ //时间事件的id,时间事件链表中记录了最大的id long long timeEventNextId; //已注册的文件事件 aeFileEvent *events; /* Registered events */ //已经就绪,执行过处理器的文件事件 aeFiredEvent *fired; /* Fired events */ //时间事件 aeTimeEvent *timeEventHead; //事件处理器开关 int stop; ...
redis单机数据库以及持久化
单机数据库实现和持久化数据库细节实现 数据库的数据结构 源代码: typedef struct redisDb { // 数据库键空间,保存着数据库中的所有键值对 dict *dict; /* The keyspace for this DB */ // 键的过期时间,字典的键为键,字典的值为过期事件 UNIX 时间戳 dict *expires; /* Timeout of keys with a timeout set */ // 正处于阻塞状态的键 dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/ // 可以解除阻塞的键 dict *ready_keys; /* Blocked keys that received a PUSH */ // 正在被 WATCH 命令监视的键 dict *watched_keys; ...
redis基础
redis基础数据结构sds 字符串长度保存在本体中,获取需要常数时间复杂度 header包含的部分: len: 表示字符串的真正长度(不包含NULL结束符在内)。 alloc: 表示字符串的最大容量(不包含最后多余的那个字节)。 flags: 总是占用一个字节。其中的最低3个bit用来表示header的类型。 缓冲区不会溢出 减少修改时的内存重分配次数 空间预分配 alloca记录分配的总空间,惰性空间释放 除了自己加上的头部字段,其他和c函数一样,兼容相关函数 链表 双向链表 无环,头指针的prev,尾指针的next都指向null 自带指向头指针和尾指针的指针 链表具有链表长度计数器,标识长度 void *可以保存不同类型的值 dict基于哈希表实现,采用某个哈希函数从key计算得到在哈希表中的位置,采用拉链法解决冲突,并在装载因子超过预定值时自动扩展内存,引发重哈希,并且在重哈希的过程中,每次增删改查推进一步重哈希,避免重哈希期间单个请求的响应时间剧烈增加. 实现增量式重哈希,dict的数据结构里包含两个哈希表。在重哈希期间,数据从第一个哈希表向第二个哈希表迁移...
3W1H | 关于写博客的反思
3W1H | 关于写博客的反思Why?为什么会想起来写博客?也就是之前只是做了一个比较粗糙的主页,现在想要丰富一下自己的页面 What?都写一些什么主题的博客?大概就是记录自己学习过程的东西吧,主要做的就是redis方面的 Who?写出来的博客都是给谁看的?更多只是自己学习方面的记录,我觉得有时间摸摸鱼写一下就是很给博客面子了 How much?要花多少时间和金钱来运营维护?不准备花多少时间哈哈哈哈哈哈我可能就是心血来潮搞一下而已
