
Redis源码剖析
文章平均质量分 93
更新redis源码剖析文章,也会同步更新redis代码中文注释 https://github.com/xindoo/redis,欢迎关注。
xindoo
10+年技术博主,博客专家,曾就职于阿里 小米,目前任贝壳资深工程师。拥有运维、搜索广告、后端业务相关工作经验,擅长Java、Lniux、Redis……
展开
-
Redis源码剖析系列博文开篇&大纲
今年我启动了好几个比较有挑战的个人项目,比如写一门编程语言、成为一名视频UP主、写科幻小说…… 这些项目目前进度都很堪忧,一方面这些项目挑战都比较大,另一方面业余时间还要忙着吃吃喝喝、追剧、刷综艺、睡懒觉…… 不过有个项目进度不至于那么不堪,那就是今天的猪脚——《Redis源码剖析》系列博文,今天也是这个系列博文的开篇。为此,我也在github上建立了中文注解版的Redis源码库,详见https://github.com/xindoo/redis,目前已经添加近700行的中文注释,欢迎Star和关注。原创 2020-09-20 21:19:50 · 2775 阅读 · 3 评论 -
Redis源码剖析之GEO——Redis是如何高效检索地理位置的?
Redis GEO 用做存储地理位置信息,并对存储的信息进行操作。通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息。Redis中提供的Geo命令有如下几个:geoadd:添加经纬度坐标和对应地理位置名称。geopos:获取地理位置的经纬度坐标。geodist:计算两个地理位置的距离。georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。geohash:计原创 2021-06-14 18:03:40 · 1699 阅读 · 4 评论 -
Redis源码剖析之AOF
书接上回,上回我们详细讲解了Redis的RDB机制,RDB解决了redis数据持久化一部分的问题,为什么说一部分?因为rdb是redis中某一时刻的快照,那么在这次快照后如果数据有新的变更,它是不会被持久化下来的,必须得等到下次rdb备份。然而,生成rdb是和消耗性能的,所以它就不适合很频繁生成。Redis为了弥补这一不足提供了AOF。AOF的全称是AppendOnlyFile,源码在aof.c。其实关键就是Append(追加),核心原理很简单,就是如果执行完命令(set,del,expire……)后,发原创 2021-04-05 22:37:56 · 5774 阅读 · 3 评论 -
Redis源码剖析之RDB
我们小学三年级的时候就知道,redis是一个纯内存存储的中间件,那它宕机会怎么样?数据会丢失吗?答案是可以不丢。 事实上redis为了保证宕机时数据不丢失,提供了两种数据持久化的机制——rdb和aof。 rdb就定期将内存里的数据全量dump到磁盘里,下次启动时就可以直接加载之前的数据了,rdb的问题是它只能提供某个时刻的数据快照,无法保证建立快照后的数据不丢,所以redis还提供了aof。aof全程是Append Only File,它的原理就是把所有改动一条条写到磁盘上。这篇博客我们来重点介绍下rd原创 2021-03-28 20:53:31 · 1191 阅读 · 2 评论 -
Redis源码剖析之内存淘汰策略(Evict)
Redis作为一个成熟的数据存储中间件,它提供了完善的数据管理功能,比如之前我们提到过的数据过期和今天我们要讲的数据淘汰(evict)策略。在开始介绍Redis数据淘汰策略前,我先抛出几个问题,帮助大家更深刻理解Redis的数据淘汰策略。 何为数据淘汰,Redis有了数据过期策略为什么还要有数据淘汰策略?淘汰哪些数据,有什么样的数据选取标准? Redis的数据淘汰策略是如何实现的? 何为Evict我先来回答第一个问题,Redis中数据淘汰实际上是指的在内存空间不足时,清理掉某些数据以节省内存原创 2021-02-28 21:05:30 · 1439 阅读 · 1 评论 -
Redis源码剖析之数据过期(expire)
我之前统计过我们线上某redis数据被访问的时间分布,大概90%的请求只会访问最新15分钟的数据,99%的请求访问最新1小时的数据,只有不到千分之一的请求会访问超过1天的数据。我们之前这份数据存了两天(近500g内存数据),如果算上主备的话用掉了120多个Redis实例(一个实例8g内存),光把过期时间从2天改成1天就能省下60多个redis实例,而且对原业务也没有啥太大影响。 当然Redis已经实现了数据过期的自动清理机制,我所要做的只是改下数据写入时的过期时间而已。假设Redis没有数据过期的机制,原创 2021-01-24 12:03:16 · 1728 阅读 · 2 评论 -
Redis源码剖析之robj(redisObject)
我们在之前的文章中已经了解过一部分Redis的数据结构了,尤其是dict 中讲到,可以把redis看做一个hashtable,存储了一堆的key-value,今天就来看下key-value中value的主要存储结构redisObject(后文统称robj)。 robj的详细代码见object.c字段详解相对与其他几个数据结构,robj相对简单,因为只包含了几个字段,含义都很明确。typedef struct redisObject { unsigned type:4; // 数据原创 2021-01-10 22:52:51 · 1182 阅读 · 0 评论 -
Redis源码剖析之字典(dict)
Dict在redis中是最为核心的一个数据解构,因为它承载了redis里的所有数据,你可以简单粗暴的认为redis就是一个大的dict,里面存储的所有的key-value。redis中dict的本质其实就是一个hashtable,所以它也需要考虑所有hashtable所有的问题,如何组织K-V、如何处理hash冲突、扩容策略及扩容方式……。Redis中hashtable的实现,但Redis创新的引入了渐进式hash以减小hashtable扩容是对性能带来的影响,接下来我们就来看看redis中的dict有何原创 2020-12-06 16:44:49 · 1315 阅读 · 0 评论 -
Redis源码剖析之跳表(skiplist)
最近要换新工作了,借着新老工作交替的这段窗口放松了下,所以专栏拖更了,不过我心里毫无愧疚,毕竟没人催更。 不过话说回来天天追剧 刷综艺的日子也很是枯燥,羡慕你们这些正常上班的人,每天都有正经工作内容,感觉你们过的很充实。[狗头]计算机领域有很多种数据结构,数据结构的存在要么是为了节省时间、要么是为了节省空间,或者二者兼具,所以就有部分数据结构有时间换空间,空间换时间之说。其实还有某些以牺牲准确性来达到节省时间空间的数据结构,像我之间讲过的bloomfilter就是其中的典型。而今天要讲的skiplis.原创 2020-11-22 17:18:07 · 1483 阅读 · 1 评论 -
Redis源码剖析之快速列表(quicklist)
@TOC何为quicklist,上次说到ziplist每次变更的时间复杂度都非常高,因为必须要重新生成一个新的ziplist来作为更新后的list,如果一个list非常大且更新频繁,那就会给redis带来非常大的负担。如何既保留ziplist的空间高效性,又能不让其更新复杂度过高? redis的作者给出的答案就是quicklist。 其实说白了就是把ziplist和普通的双向链表结合起来。每个双链表节点中保存一个ziplist,然后每个ziplist中存一批list中的数据(具体ziplist大小可配置原创 2020-10-18 21:49:15 · 2859 阅读 · 1 评论 -
Redis源码剖析之压缩列表(ziplist)
本来打算只用一篇文章来讲解Redis中的list,在实际写作过程中发现Redis中有多种list的实现,所以准备拆成多篇文章,本文主要讲ziplist,ziplist也是quicklist的基础。另外还有skiplist,skiplist虽然是list,当主要和set命令相关,所以会放到后面。本文主要涉及到的源码在ziplist.c何为ziplist?我们可以在ziplist.c源码头部找到一段Redis作者的一段介绍。The ziplist is a specially encoded duall原创 2020-10-04 23:00:56 · 2918 阅读 · 2 评论 -
Redis源码剖析之SDS(Simple Dynamic String)
SDS(simple dynamic string)是Redis提供的字符串的封装,在redis中也是存在最广泛的数据结构,它也是很多其他数据结构的基础,所以才选择先介绍SDS。 SDS也兼容部分C字符串API(strcmp,strlen),它如何兼容C字符串我觉得也是有个很sao的操作,等看完我这篇博客你就明白了。在开始正式内容前,我先抛几个问题(有些也是面试高频题),带着问题去学习也是一种非常好的学习方法。C语言中也算是支持String了,为什么Redis还要自己封装一个?SDS中的D(dynam原创 2020-09-26 12:47:36 · 3806 阅读 · 2 评论