![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis源码学习
文章平均质量分 81
无痕之意
路漫漫其修远兮,吾将上下而求索!
展开
-
Redis源码学习(33),命令执行过程
本节主要是学习 redis 的命令如何执行的。原创 2022-07-23 13:48:04 · 664 阅读 · 0 评论 -
Redis源码学习(32),字典学习,dict.c(二)
本节主要学习 dictReplace、dictGenericDelete、dictFind原创 2022-07-17 11:58:12 · 465 阅读 · 0 评论 -
Redis源码学习(31),字典学习,dict.c(一)
本节主要学习字典是如何初始化和添加哈希节点的,主要方法是dictAdd、dictCreate原创 2022-07-02 13:51:48 · 468 阅读 · 0 评论 -
Redis源码学习(30),字典学习,dict.h
本次学习内容主要是 Redis 源码中的 dict.h 文件,学习字典的相关结构体定义,更清楚了解字典的底层实现。原创 2022-07-02 11:16:55 · 534 阅读 · 0 评论 -
Redis源码学习(29),压缩列表学习,ziplist.c(二)
本节主要学习 Redis 源码中的 Ziplist 的 节点遍历的几个方法,包含了 ziplistIndex、ziplistNext、ziplistPrev原创 2022-06-25 19:26:47 · 585 阅读 · 0 评论 -
Redis源码学习(28),压缩列表学习,ziplist.c(一)
经过我们的不懈努力终于把SDS和双端链表搞定之后,现在要进入压缩列表数据结构的学习,ziplist是列表、hash、有序集合的数据结构之一。 压缩列表听名字是经过压缩的一种列表,是用提高内存使用率的一种数据结构,下面我们就来看看它究竟是什么样的数据结构。1 介绍1.1 ziplist 虽然网上有很多关于Redis中ziplist介绍,不过我们最好还是阅读作者的说明更加准确点。/* The ziplist is a specially encoded dually linked list t原创 2022-05-15 17:28:40 · 605 阅读 · 0 评论 -
Redis源码学习(27),双端链表在列表中的应用
前几天我们学习了双端链表的源代码,想必大家已经清楚了不少有关链表的操作,这个时候再回想一下之前我们学习的数据结构列表的代码,我们知道双端链表是实现列表的数据结构之一,所以源代码里有很多关于链表的操作,今天我们就来回顾下列表的源代码,并探索下双端链表在列表的中的应用,通过这次发现我们能对列表的源代码学习就更加深入了。 今天我们要学习的源代码涉了好几个文件,不过都是我们之前阅读过的,分别是t_list.c、adlist.h、adlist.c。1 listCreate listCreate 是双端链原创 2022-05-14 15:59:22 · 280 阅读 · 0 评论 -
Redis源码学习(26),双端链表学习,adlist.c(一)
1 listCreate1.1 方法说明 创建一个双端链表。1.2 方法源代码 list *listCreate(void) { struct list *list; if ((list = zmalloc(sizeof(*list))) == NULL) return NULL; list->head = list->tail = NULL; list->len = 0; list->dup = N原创 2022-05-13 17:46:25 · 498 阅读 · 0 评论 -
Redis源码学习(25),双端链表学习,adlist.h
前言 学习完SDS之后,我们了解了Redis字符串的底层数据结构,对Redis在提升性能的一些处理上有了一些简单的了解,这是一个非常不错的开始,但这还是冰山一角,我们还有很多知识我们需要去学习。 相信学习完SDS之后,大家和我一样应该有了不少信心,数据结构也不是那么难对吧,接下来我们要学习的是双端链表,它是实现列表的底层数据结构之一,只要我们弄清楚双端链表再回过头去温习下之前我们学习过的列表的一些方法,想必就能更加清楚了。 Redis将双端链表的代码放在了adlist.h和adlist.c两个文原创 2022-05-13 16:21:31 · 386 阅读 · 0 评论 -
Redis源码学习(24),sds学习总结
1 学习回顾Redis源码学习(21),sds学习,sds.hRedis源码学习(22),sds学习,sds.c(一)Redis源码学习(23),sds学习,sds.c(二)2 学习概括2.1 SDStypedef char *sds;struct sdshdr { unsigned int len; unsigned int free; char buf[];};SDS 是动态字符串(Simple Dynamic String,SDS)的简称。SDS 包含原创 2022-05-13 14:27:24 · 458 阅读 · 0 评论 -
Redis源码学习(23),sds学习,sds.c(二)
1 sdsMakeRoomFor1.1 方法说明 扩容方法,扩大sds字符串末尾的空闲空间1.2 方法源代码/* Enlarge the free space at the end of the sds string so that the caller 1. is sure that after calling this function can overwrite up to addlen 2. bytes after the end of the string, plus one mor原创 2022-05-13 12:10:54 · 487 阅读 · 0 评论 -
Redis源码学习(22),sds学习,sds.c(一)
1 sdsnewlen1.1 方法说明 这个方法主要创建一个新的sds字符串。1.2 方法源代码/* Create a new sds string with the content specified by the 'init' pointer 1. and 'initlen'. 2. If NULL is used for 'init' the string is initialized with zero bytes. 3. 4. The string is always null-原创 2022-05-05 22:03:17 · 401 阅读 · 0 评论 -
Redis源码学习(21),sds学习,sds.h
前言 前面学习了五种数据类型的源代码,今天开始学习他们对应的数据结构源代码,首先出场的是实现字符串的数据结构,简单动态字符串(Simple Dynamic String,SDS),如果大家是第一次听到这个东西应该会有点懵,不过不要紧我会尽量用简单的方式来介绍它。 这里要重新强调一下,本次源码学习针对的是Redis源码3.0版本,因为不同版本代码是不一样的,免得大家到时看半天发现自己的阅读的代码和我讲不一样。1 SDS是什么 SDS 是动态字符串的缩写,是Redis专门设计的一种字符串结构,为了原创 2022-05-05 20:30:04 · 1229 阅读 · 0 评论 -
Redis源码学习(20),学习感悟
最近学习Redis源码也有半个月的时间了,有不少收获也有不少感悟,今天来好好聊聊我学习的感悟。1 发现问题 人非圣贤孰能无过,只要是人难免会犯错,回顾我之前的学习历程,其实是可以发现不少的问题,大概有学习方式混乱、流于形式、忘记、不深入、精神面貌欠佳、敷衍了事、收获不足、不够求真、无趣。学习方式混乱学习动力不足 下面具体分析下这些问题,看下这些问题究竟是什么,为什么会产生这些问题,那又怎么解决这些问题。2 学习方式混乱2.1 缺少方向感 Redis的代码非常多,从哪里学,怎么学原创 2022-05-03 16:18:47 · 1448 阅读 · 0 评论 -
Redis源码学习(19),数据类型源代码,学习总结
经过将近半个月的学习,终于将五种数据类型的源代码都学习了一遍,虽然不是全部阅读,但是大部分的代码都已经学习到了,趁五一假期好好整理和总结一下近期我们学习的内容。1 数据类型介绍 在Redis中有五种数据类型,分别是字符串、列表、集合、有序集合、哈希,在源代码 redis.h 头文件中,有对应他们的常量定义,每次判断对象类型的时候会使用到这几个常量。/* Object types */#define REDIS_STRING 0#define REDIS_LIST 1#define REDI原创 2022-05-02 20:03:33 · 1592 阅读 · 0 评论 -
Redis源码学习(18),t_zset.c 学习(三),学习总结
1 方法列表zskiplistNode *zslCreateNode(int level, double score, robj *obj)zskiplist *zslCreate(void)void zslFreeNode(zskiplistNode *node)void zslFree(zskiplist *zsl)int zslRandomLevel(void)zskiplistNode *zslInsert(zskiplist *zsl, double score, robj原创 2022-05-01 14:33:30 · 1329 阅读 · 0 评论 -
Redis源码学习(17),t_zset.c 学习(二),zrem、zrange 命令学习
1 zremCommand1.1 方法说明 从有序集合中移出一些成员,成功返回移出成员的数量。1.2 命令实践1.3 方法源代码void zremCommand(redisClient *c) { //获取键值 robj *key = c->argv[1]; robj *zobj; int deleted = 0, keyremoved = 0, j; //获取有序集合对象,并判断对象类型 if ((zobj = lookupKeyWriteOr原创 2022-05-01 13:49:09 · 736 阅读 · 0 评论 -
Redis源码学习(16),t_zset.c 学习(一),zadd 命令学习
学习完 t_string.c、t_list.c、t_hash.c、t_set.c 源代码之后,终于来到了五种数据类型最后的环节有序集合,对应的源代码是 t_zset.c,,我估略看了下这个文件的代码,不仅代码量比之前的几个文件多,而且复杂程度也比之前高,不过我们一路走过来相当不容易,马上就到成功的终点,不能在这最后一步就退缩了,兄弟们加油,一鼓作气冲过去。1 前言1.1 原文注释 这回不同以往直接上来就看代码,先看一段作者的注释说明,在 t_zset.c中作者的注释是比较多的,可见晦涩程度比较高原创 2022-04-30 16:15:47 · 1805 阅读 · 0 评论 -
Redis源码学习(15),t_set.c 学习(三),学习总结
1 方法列表robj *setTypeCreate(robj *value)int setTypeAdd(robj *subject, robj *value)int setTypeRemove(robj *setobj, robj *value)int setTypeIsMember(robj *subject, robj *value) setTypeIterator *setTypeInitIterator(robj *subject)void setTypeReleaseIte原创 2022-04-30 13:46:56 · 597 阅读 · 0 评论 -
Redis源码学习(14),t_set.c 学习(二),sismember,scard,spop 命令学习
1 sismemberCommand1.1 方法说明 判断一个值是否属于集合的成员,成功返回1,失败返回0。1.2 命令实践1.3 方法源代码void sismemberCommand(redisClient *c) { robj *set; //获取集合键对象 if ((set = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || checkType(c,set,REDIS_SET)原创 2022-04-29 11:45:33 · 750 阅读 · 0 评论 -
Redis源码学习(9),t_list.c 学习(四),学习总结
时间过的真快呀,一眨眼又过去了好几天,这几天我们学习了t_list.c文件不少方法,趁今天来总结一番。1 方法列表 先看一下这个文件都有哪些方法/*----------------------------------------------------------------------------- * List API *----------------------------------------------------------------------------*/void原创 2022-04-25 21:02:34 · 1610 阅读 · 0 评论 -
Redis源码学习(13),t_set.c 学习(一),sadd,srem 命令学习
学习完 t_string.c、t_list.c、t_hash.c文件后,现在开始学习 t_set.c 的代码,从文件名可以看到是相关集合相关命令的代码文件。总共5种数据结构,我们已经学习到第4个了,离成功不远了,再加一把劲加油。1 saddCommand1.1 方法说明 向一个集合中添加元素。1.2 命令实践 添加成功返回添加元素的个数。1.3 命令源代码void saddCommand(redisClient *c) { robj *set; int j, add原创 2022-04-28 22:24:53 · 1268 阅读 · 0 评论 -
Redis源码学习(12),t_hash.c 学习(三),学习总结
1 方法列表void hashTypeTryConversion(robj *o, robj **argv, int start, int end)void hashTypeTryObjectEncoding(robj *subject, robj **o1, robj **o2)int hashTypeGetFromZiplist(robj *o, robj *field, unsigned char **vstr,原创 2022-04-27 15:01:43 · 153 阅读 · 0 评论 -
Redis源码学习(11),t_hash.c 学习(二),hget 相关命令学习
1 hgetCommand1.1 方法说明 获取hash键的键值1.2 命令实践1.3 方法源代码void hgetCommand(redisClient *c) { robj *o; if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL || checkType(c,o,REDIS_HASH)) return; addHashFieldToReply(c, o原创 2022-04-27 13:01:24 · 459 阅读 · 0 评论 -
Redis源码学习(10),t_hash.c 学习(一),hset、hmset 命令学习
学习完 t_string.c、t_list.c文件后,现在开始学习 t_hash.c 的代码,从文件名可以看到是相关hash的相关命令代码。1 hsetCommand1.1 方法说明 对一个hash键,设置一个键值对。1.2 命令实践新增成功返回1,修改返回01.3 方法源代码void hsetCommand(redisClient *c) { int update; robj *o; //获取键对象,如果不存在就创建一个 if ((o = hashTyp原创 2022-04-26 17:33:03 · 1722 阅读 · 0 评论 -
Redis源码学习(8),t_list.c 学习(三),llen、lindex、lrange 命令实现学习
1 llenCommand1.1 方法说明 获取一个列表元素的个数1.2 命令实践1.3 方法源代码void llenCommand(redisClient *c) { robj *o = lookupKeyReadOrReply(c,c->argv[1],shared.czero); if (o == NULL || checkType(c,o,REDIS_LIST)) return; addReplyLongLong(c,listTypeLength(o));原创 2022-04-25 17:15:41 · 1117 阅读 · 0 评论 -
Redis源码学习(7),t_list.c 学习(二),rpop、lpop命令实现学习
1 popGenericCommand1.1 方法说明 这是一个lpop、rpop命令的基础方法,两个命令都会调用这个方法。1.2 方法源代码void popGenericCommand(redisClient *c, int where) { //获取列表键对象 robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk); //检查对象 if (o == NULL || checkType(c,o,RE原创 2022-04-21 17:38:28 · 2377 阅读 · 0 评论 -
Redis源码学习(6),t_list.c 学习(一),rpush、lpush命令实现学习
前言 大体学习完t_string.c的代码,我们正式进入下一个文件的学习,这一次我们学习的是t_list.c文件,从文件名我们可以知道这是一个关于列表的相关命令的源代码。 在学习列表命令之前,这里要介绍一下,在Redis中列表的底层数据结构由压缩表和链表实现,所以在今天的学习中会发现大量的底层数据结构判断,根据不同的数据结构使用不同的方法。不过这里要注意的是,这里是基于3.0版本的源代码,3.2版本之后发生了变化,3.2版本之后使用了快速表来实现。1 pushGenericCommand1.1原创 2022-04-21 15:29:25 · 1724 阅读 · 0 评论 -
Redis源码学习(5),t_string.c 学习(四),学习总结
经过几天的学习,我们差不多把t_string.c这个文件的一些方法都学习了一遍,也有了不少的收获,我们今天简单的总结一下我们究竟学到了哪些东西或者了解了哪些东西。1 方法列表我们先回顾下这个文件的方法列表//set相关方法void setGenericCommand(redisClient *c, int flags, robj *key, robj *val, robj *expire, int unit, robj *ok_reply, robj *abort_reply) voi原创 2022-04-20 22:03:02 · 608 阅读 · 0 评论 -
Redis源码学习(4),t_string.c 学习(三),incr、decr相关命令实现学习
学习完两个常用命令get和set命令,再来看下另外几个命令incr、decr、incrby、decrby的代码实现。1 incrDecrCommand1.1 方法说明 这个方法是incr、decr、incrby、decrby等命令的基础方法。1.2 方法源代码void incrDecrCommand(redisClient *c, long long incr) { long long value, oldvalue; robj *o, *new; o = look原创 2022-04-16 14:58:28 · 1141 阅读 · 0 评论 -
Redis源码学习(3),t_string.c 学习(二),get命令实现学习
昨天我们学习了t_string.c代码文件中 get 的相关方法,相信大家已经熟悉不了少 redis 代码的风格和结构,所以今天趁热打铁继续学习剩下的一些方法,由于方法还是比较多的,我们就先学习主要并且我们常用的一个命令 get ,刚好和昨天 set 相对应起来。1 getGenericCommand1.1 方法说明 这是get方法的一个通用方法,get命令通过调用这个方法来获取值1.2 命令源代码int getGenericCommand(redisClient *c) { rob原创 2022-04-15 12:23:06 · 799 阅读 · 0 评论 -
Redis源码学习(2),t_string.c 学习(一),Set命令实现学习
现在进入Redis源码的学习,首先我们先学习最简单的字符串文件,文件名是t_string.c,该文件在src目录下面,这个文件里面实现了set和get相关一系列命令的方法,今天着重来分析set命令的实现。原创 2022-04-14 17:29:10 · 1092 阅读 · 0 评论 -
Redis源码学习(1)为什么要学习源码呢?
想学习Redis源码的伙伴,可以一起互相学习原创 2022-04-14 12:12:57 · 1546 阅读 · 0 评论