redis
tydhot
gogogo
展开
-
redis radix tree的简单解释
所有例子均出自源码。Radix tree压缩前缀树,是redis在5.0新加入的用来存储key的数据结构。前缀树的节点结构如下。typedef struct raxNode { uint32_t iskey:1; /* Does this node contain a key? */ uint32_t isnull:1; /* Associated va...原创 2019-10-13 13:01:02 · 1021 阅读 · 0 评论 -
redis aof持久化
执行aof持久化的方法是flushAppendOnlyFile()方法,该方法根据选择的aof持久化策略将处于aof缓冲区中以sds形式保存的数据持久到文件当中去。flushAppendOnlyFile()方法只有一个int形式用来表示是否强制执行的持久化的force参数,在AOF_FSYNC_EVERYSEC策略下,如果距离上次将缓冲区数据持久化操作的时间开始还不足2秒,在强制执行的情况下也...原创 2019-01-10 02:16:18 · 250 阅读 · 0 评论 -
redis sds的申请扩容源码
sds是redis中简单的字符串实现sdsnewlen()方法可以用来申请sds。sds sdsnewlen(const void *init, size_t initlen);第一个参数是sds中字符串的内容,initlen则是第一次初始化的长度。 首先会根据第一次初始化所需要的长度根据其所占位数通过sdsReqType()得到内存的结构体。static inline...原创 2018-12-28 01:17:40 · 1519 阅读 · 0 评论 -
redis压缩列表ziplist的连锁扩容
redis中的压缩列表在插入数据的时候可能存在连锁扩容的情况。在压缩列表中,节点需要存放上一个节点的长度,当上一个entry节点长度小于254个字节的时候,将会一个字节的大小来存放entry中的数据,但是当其长度大于等于254的时候,就会需要更大的空间来存放数据。在压缩列表中,会把大于等于254字节长度用5个字节来存储,第一个字节是254,当读到254的时候,将会确认接下来的4个字节大小将是e...原创 2018-12-11 01:28:47 · 1328 阅读 · 0 评论 -
redis的压缩列表源码ziplist解析
压缩列表的具体数据结构如下:<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>其中zlbytes为4字节大小,代表这个列表的大小。zltail为4字节大小,为最后一个entry的地址。zllen为2字节大小,代表列表中entr原创 2018-12-09 21:01:53 · 636 阅读 · 0 评论 -
redis bio线程任务队列
bio部分是redis中负责后台进行文件关闭,aof文件缓冲区同步到磁盘,清理对象三种任务的部分。/* Background job opcodes */#define BIO_CLOSE_FILE 0 /* Deferred close(2) syscall. */#define BIO_AOF_FSYNC 1 /* Deferred AOF fsync. */#de...原创 2019-01-11 00:17:32 · 1716 阅读 · 0 评论 -
redis aof重写
除了手动条件下,有两种条件会自动触发redis的aof重写。if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_scheduled) { rewriteAppendOnlyFileBackground();...原创 2019-01-24 23:50:53 · 1451 阅读 · 0 评论 -
redis aof命令缓冲区的写入源码
需要通过aof记录的命令主要为set命令和过期命令,这些命令在执行完毕后需要记录到aof缓冲区中以便写入到aof文件中。sds aof_buf; /* AOF buffer, written before entering the event loop */在结构体redisServer中通过一个sds来作为aof的缓冲区。 Redis服务器在执行完相应的命令的时候,如...原创 2019-01-08 21:13:45 · 1119 阅读 · 2 评论 -
redis lru和lfu的实现
在redis的lru的实现与传统的lru实现不同。具体实现在evict.c文件中,当redis需要通过释放缓存的key来释放空间时,将会通过ecict.c的freeMemoryIfNeeded()函数来通过设定的算法来清除key以腾出空间。其中,如果配置的策略是ALL_KEYS才会从所有缓存的key尝试释放,否则只会从存在过期时间的key中进行释放。struct evictionPo...原创 2019-06-11 22:34:35 · 1851 阅读 · 0 评论