
redis
文章平均质量分 85
繁华落尽梦一场
暮春者,春服既成,冠者五六人,童子六七人,浴乎沂,风乎舞雩,咏而归
展开
-
redis源码分析——6、跳表skiplist的实现
skiplist是很有用的一种数据结构,在面试中也常见,效率上基本和红黑树等价,而编码实现又比红黑树简单很多1. 怎么样自己实现一个dict 不像C++、java等高级语言内置了map,C语言并没有提供dict库,所以如果想使用dict就需要自己实现。那么实现一个dict有方法呢?数组法这也是最容易实现的一种方法,简单说就是开辟一个长度为N的大数组(通常N是一个质数),然后通过一个哈希函数计算key的哈希值d,然后用d%N得到key对于的数组下边。设想一下,如果数组开的足够大,而且哈希函数.原创 2021-10-28 00:06:16 · 314 阅读 · 0 评论 -
redis源码分析——5、dict实现
dics是一种常用的数据结构,而C语言没有提供内置类型,本文一起看看redis中dict的实现1. 怎么样自己实现一个dict 不像C++、java等高级语言内置了map,C语言并没有提供dict库,所以如果想使用dict就需要自己实现。那么实现一个dict有方法呢?数组法这也是最容易实现的一种方法,简单说就是开辟一个长度为N的大数组(通常N是一个质数),然后通过一个哈希函数计算key的哈希值d,然后用d%N得到key对于的数组下边。设想一下,如果数组开的足够大,而且哈希函数足够散列,我们.原创 2021-10-28 00:04:57 · 302 阅读 · 0 评论 -
redis源码分析——4、压缩列表ziplist实现
ziplist原理简单,但实现起来较麻烦,尤其是连锁更新的时候,本文一起看看ziplist的具体实现一、存储结构ziplist:内存布局 各字段含义zlbytes:压缩列表的字节长度,占4个字节,因此压缩列表最长(2^32)-1字节;zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量,占4个字节;zllen:压缩列表的元素数目,占两个字节;那么当压缩列表的元素数目超过(2^16)-1怎么处理呢?此时通过zllen字段无法获得压缩列表的元素数目,必须遍历整个压缩列.原创 2021-10-28 00:03:40 · 347 阅读 · 0 评论 -
redis源码分析——3、简单动态字符串
redis对C语言的原生char*做了封装,关于string只讨论两个问题:1、redis支持的最长string是多少?2、string的扩容策略一、相关定义sds的定义typedef char *sds;sdshdr的定义/* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS stri.原创 2021-10-28 00:02:10 · 149 阅读 · 0 评论 -
redis源码分析——2、读写应答
了解了redis网络框架后,我们具体看看请求->回复的过程到底是怎么样的一、读回调客户端的消息处理循环有上一节可知,redis通过epoll来检测是否有客户端接入,一旦有请求,则会调用acceptTcpHandler,然后再调用createClient将fd和client对应起来,最后挂在到全局的server.clients链表上面。在createClient里面又调用了connSetReadHandler**(conn, readQueryFromClient)来将client加入到e.原创 2021-10-27 23:58:21 · 292 阅读 · 0 评论 -
redis源码分析——1、网络框架
一、 核心数据结构ConnectionType, ConnectionType定义了网络连接的接口,包含read、write等,具体定义如下。typedef struct ConnectionType { void (*ae_handler)(struct aeEventLoop *el, int fd, void *clientData, int mask); int (*connect)(struct connection *conn, const char *addr, int原创 2021-10-27 23:55:11 · 338 阅读 · 0 评论