![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis 设计与实现
Ethan3014
头发多睡眠足有妹子的程序员
展开
-
redis server事件处理
分类 文件事件: server-client server-slave 定时事件 serverCron 单线程 所谓的redis单线程,其实就是指事件处理器的单线程。各类事件轮流处理,不会抢占原创 2020-10-24 13:06:42 · 65 阅读 · 0 评论 -
aof
作用 追加服务器执行的命令 格式 文本: *2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n 这个就是redis的文本协议,所以redis可以像读取客户端命令那样还原数据 aof buffer typedef struct redisServer { sds aof_buf; } 缓冲文件也是一个sds,很奇怪为啥不是循环缓冲区 aof rewrite 1, fork 2,scan & write(集合命令会分多次写入,每次64(默认)) 3,子进程退出 4,父进程记录aof重写原创 2020-10-24 12:58:44 · 59 阅读 · 0 评论 -
rdb
用途 数据快照,可以定期保存 使用 save:不fork,阻塞服务器,期间不处理client请求,不推荐 bgsave:子进程save,请求正常 相关命令 save, bgsave, bgrewriteaof,不能同时执行 自动执行 save duration updates save 900 10000 在900s以内有10000次更新就执行bgsave typedef struct saveparan { time_t seconds; int changes; } 状态保存 typedef stru原创 2020-10-24 11:28:43 · 113 阅读 · 0 评论 -
服务器
database 默认16个,是一个数组, int dbnum db num是保存在redisClient里面的,每个建立好链接的redis client都会分配一个redisClient保存session信息 redisDb typedef struct redisDb { dict *dict; dict *expires; }; 每个redis数据库都是一个大dict,所以我们要少用单独的kv,多用hash, set等数据结构。 统计数据 keyspace_hits keyspace_misses原创 2020-10-23 17:09:58 · 42 阅读 · 0 评论 -
对象
定义 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等。 Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。 对象进一步封装来数据和算法,隐藏了细节,并且还增加了引用计数,ttl,访问时间等属性 数据结构 查看对象的属性:原创 2020-10-22 22:44:03 · 65 阅读 · 0 评论 -
ziplist
用途 list, zset, hash 条件 items比较少 小整数 短字符串 数据结构 content的内容根据encoding来决定,c语言最大的好处就是可以直接强制内存转换来把同一块内存地址的值更改为不同的类型 prev_entry_len用于反向遍历,也是可变长度的 算法复杂度 由于每个entry都是可变的,所以在删除和更改的时候有可能导致级联更新 ...原创 2020-10-22 22:10:41 · 118 阅读 · 0 评论 -
整数集合
使用场景 当集合里面只包含整数并且集合数量较小的时候就用intset,为啥还必须说明集合较小的时候呢?因为如果集合较大,这时候再把key转换为string工作量就比较大了 实现 typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset; 如果老老实实通过contents[原创 2020-10-22 21:10:17 · 1167 阅读 · 0 评论 -
跳跃表
特点 1,每个节点多个指针 2,有序链表 3,基本平衡,平均logn 使用 只有zset使用了 还有集群的内部实现原创 2020-10-20 20:17:07 · 61 阅读 · 0 评论 -
字典
使用 1,redis的db space就是一个大map 2, hash value 定义 typedef struct dictht { dictEntry **table; unsigned long size; unsigned sizeMask;//size-1, eg: 0xFFFFFF unsigned long used; } dictht; struct dictEntry { void *key; union { void *value uint64_t u64; int64_t s64;原创 2020-10-20 19:49:00 · 60 阅读 · 0 评论 -
链表
定义 typedef struct ListNode { struct ListNode *prev; struct ListNode *next; void *value; } ListNode; typedef struct List { ListNode *head; ListNode *tail; unsigned long len; void *(*dup)(void *prt); void *(*free)(void *prt); void *(*match)(void *prt, void原创 2020-10-20 17:34:36 · 45 阅读 · 0 评论 -
简单动态字符串SDS
用途 1, redis的key(都是字符串) 2,string value 3,缓冲区(AOF/客户端输入) 特点 1,二进制安全 2,较少alloc和copy次数 3,常熟时间获取len,free 4,兼容部分c string api 5,避免缓冲区溢出 struct sdshdr{ int len; //总长 int free; //剩余 char buf[]; //data,也是以\0结尾的,但不计算在len里面 } sds在字符串增长的时候会重新分配内存并copy,为了减少内存的allocate和原创 2020-10-19 23:18:39 · 54 阅读 · 0 评论