
redis
文章平均质量分 88
ijbuhv
这个作者很懒,什么都没留下…
展开
-
redis6源码阅读之九(stream)
stream是redis对消息队列比较完备的实现。 下面图即为stream的主要的数据结构,可以看到下面的1-20即为其日志的数据,不过在stream中这些日志数据不是通过顺序表来存储的,而是通过rax这个基数树的数据结构来进行存储的。 ...原创 2021-05-27 10:59:33 · 505 阅读 · 1 评论 -
redis6源码阅读之八(rax)
阅读的版本为6.0.5 rax是redis实现的基数树(前缀树),不过其进行了数据的压缩,即将只有一个子节点的子节点压缩到其自己的节点上。 下面两张图即为其源码给的关于正常的前缀树和radis实现的前缀树的比较,可以看到其将一个节点的连续的节点都合并为一个节点,入[foo] [er],[ar]这些节点。 这种的实现的方式比较节约内存,不过在插入新的节点时比较复杂,需要进行树的分裂操作。 数据结构 可以看到下面代码和图表示的数据结构,可以看到这个前缀树的单个节点只有iskey,isnull,iscom.原创 2021-05-14 21:34:14 · 474 阅读 · 0 评论 -
redis6源码阅读之七(rdb数据结构)
阅读的版本为6.0.5 rdb时redis持久化的另一种形式,与aof存储执行过的命令形式不同,rdb的存储的是将当前的内存快照数据。 redis生成rdb文件主要是有两种形式。 一种是利用命令SAVE或者BGSAVE来让服务器生成rdb文件,这两个命令不同的是save命令会让服务器阻塞,而BGSAVE命令则是创建一个子进程,在子进程进行持久化,不会对服务器进行阻塞。 另外一种方式则是save seconds changes 这种配置来让redis在seconds时间内有changes个写操作时就会进行.原创 2021-05-07 16:17:38 · 425 阅读 · 0 评论 -
redis源码阅读之六(aof)
aof和rdb是redis的持久化的两种方式,其中aof是通过将所有的redis数据库执行过的命令都存下来的方式来持久化的,而rdb则是存储的是redis的数据快照。 aof的数据格式 aof的数据实是文本格式,可以直接阅读的,看下图是set ttt 111 这条命令打印出的日志记录,可以看到它的数据之间是通过\n\r隔开的,然后主要是有两个特殊字符。 *: 这个字符主要后接一个数字表示的是这个命令的数据条数 $: 这个符号表示的是下面的这个这条数据的长度 分析一下下面得到这串字符,可以看到首先的*2原创 2021-04-29 15:36:44 · 362 阅读 · 0 评论 -
redis源码阅读之五(淘汰机制)
redis在内存超过其配置的maxmemory时,则会通过配置maxmemory-policy的配置的不同策略来淘汰key。这些淘汰策略主要有下面8种 配置 说明 volatile-lru 从expires的dict中,利用近似的lru算法淘汰 volatile-lfu 在expires中找,利用近似的lfu算法淘汰 volatile-ttl 在expires中找,然后通过ttl计算淘汰 volatile-random 在expires中随机找节点淘汰 allkeys-lru原创 2021-04-23 11:58:12 · 253 阅读 · 0 评论 -
redis源码阅读之四(zset)
zset是redis的有序集合对象,它是由skipList和dict这两种数据结构来实现的(在数据量较小的时候是用的zipList来实现的)。 其中skipList主要是zrank,zrange 这些操作能在o(log(n))的复杂度内完成,而dict中存储的主要是<key,score>的键值对,他能是的zscore这种操作能在O(1)的复杂度内完成。 数据结构 下面的代码即为zset的数据结构 //跳表每个节点的结构 typedef struct zskiplistNode { sds原创 2021-04-21 22:50:39 · 235 阅读 · 0 评论 -
redis源码阅读之三(dict)
dict是redis中使用的很多的一种数据结构,redis中的一个数据库其实就是一个dict,而且redis的hash相关的命令都是通过dict来实现的。 dict其实和java中的hashMap很像,他们最大的差异是rehash的操作不同,hashMap是直接对自己的table进行扩容,而dict是会维护两个table,在进行rehash的时候是会创建一个新的table,然后再慢慢地将旧地table中地数据转移到新地table中。 数据结构 下图展示了dict的数据结构,首先看一下dict的结构,下面代码原创 2021-04-21 10:43:55 · 277 阅读 · 0 评论 -
redis源码阅读之二(geo)
geo主要是用来获取地图附近的单位(美团的附近商家,共享单车的附近的单车等)。 geo通过对地图上的一个一个位置描述用二维的经纬度来表示,经度范围为(-180,180),维度的范围为(-90,90)。 而对于获取某个经纬度坐标(x,y)附近的其他的单位的问题,其实类似于下面图中找以坐标点(x,y)为中心的矩形中的单位。其实就是查找坐标点集合中横坐标坐标x1在范围[x-dx,x+dx],纵坐标在[y-dy,y+dy]的所有的位置集合。 ...原创 2021-04-16 15:32:34 · 481 阅读 · 0 评论 -
redis源码阅读之一(zipList)
zipList是redis为了节约内存开发而设计的,zipList是内存连续的。 zipList的数据结构 下面图即为zipLst的数据结构,其中: zlbytes: 记录整个压缩列表的内存的数量,主要是用来进行对这个压缩列表的内存重新分配 zltail: 记录的是这个zipList的起始地址到尾节点的偏移量,通过这个偏移量能直接找到这个链表的尾节点 zlen: 主要存储的是整个压缩列表的节点的数量,需要注意的是它是两个字节,当其字节超过65535(包括)时,则需要通过遍历才能找到这个zipLi原创 2021-04-16 15:31:45 · 303 阅读 · 1 评论