这个文件我在今天分析学习的时候,一直有种似懂非懂的感觉,代码量700+的代码,最后开放给系统的就是一个process()方法.这里说的说的数据库检測,是针对key的检測,会用到,以下提到的结构体: /* Data type to hold opcode with optional key name an success status */ /* 用于key的检測时使用.兴许检測操作都用到了entry结构体 */ typedef struct { //key的名字 char* key; //类型…
今天的学习更有效率.该Rio分析过,学习之间的另一种方式RedisObject文件,只想说RedisObject有些生成和转换.都是很类似的.列出里面长长的API列表: /* ------------ API --------------------- */ robj *createObject(int type, void *ptr) /* 最初的创建robj对象方法,后面的创建方法与此相似 */ robj *createStringObject(char *ptr, size_t len)…
在上篇文章中初步的分析了一下,Redis工具类文件里的一些使用方法,包含2个随机算法和循环冗余校验算法,今天,继续学习Redis中的其它的一些辅助工具类的使用方法.包含里面的大小端转换算法,sha算法在Redis中的实现和通用工具类算法util.c. 先来看看大小端转换算法,大小端学习过操作系统的人一定知道是什么意思,在不同的操作系统中,高位数字的存储方式存在,高位在前,低位在后,或是高位在后,低位在前,所以这里面就涉及到转换,依据不同的操作系统,有不同的转换方式,所以Redis在这方面就开放了…
上次我仅仅分析了Redis网络部分的代码一部分,今天我把networking的代码实现部分也学习了一遍,netWorking的代码很多其它偏重的是Clientclient的操作.里面addReply()系列的方法操作是基本的部分. 光光这个系列的方法,应该占领了一半的API的数量.我把API分成了3个部分: /* ------------ API ---------------------- */ void *dupClientReplyValue(void *o) /* 复制value一份 *…
事件驱动的术语出现更频繁.听起来非常大的,今天我把Redis内部驱动器模型来研究它,奖励的感觉啊.一个ae.c主程序,加4文件的事件类型,让你彻底弄清楚,Redis是怎样处理这些事件的. 在Redis的事件处理中.用到了epoll,select,kqueue和evport,evport可能大家会陌生很多.前面3个都是很常见的事件,在libevent的事件网络库中也都有出现. 作者在写这个事件驱动模型的时候.也说了,这仅仅是为了简单的复用了,设计的一个小小的处理模型: /* A simple ev…
I/O每个操作系统,它的一个组成部分.和I/O业务质量,在一定程度上也影响了系统的效率. 今天,我在了解了Redis中间I/O的,相同的,Redis在他自己的系统中.也封装了一个I/O层.简称RIO.得先看看RIO中有什么东西喽: struct _rio { /* Backend functions. * Since this functions do not tolerate short writes or reads the return * value is simplified to:…
从今天起,本人将会展开对Redis源代码的学习,Redis的代码规模比較小,很适合学习,是一份很不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望终于能把他啃完吧,C语言好久不用,快忘光了.分析源代码的第一步,先别急着想着从哪開始看起,先浏览一下源代码结构,能够模块式的渐入,只是比較坑爹的是,Redis的源代码所有放在在里面的src文件夹里,一下90多个文件统统在里面了,所以我选择了拆分,按功能拆分,有些文件你看名字就知道那是干什么的.我拆分好后的而结果例如以下: 11个…
[转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一篇文章<hostapd源代码分析(一):网络接口和BSS的初始化>中,介绍了两个重要的数据结构hostapd_iface和hostapd_data以及网络接口和BSS的初始化设置的过程.下面,我要在这一篇文章中详细介绍hostapd的工作机制.hostapd的模块结构如下 从上图中可以看出,hos…
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaData) 分别封装了数据库产品名字等数据库信息.查询参数的个数等参数信息.结果集的列数等结果集信息. 数据库元数据 /** *数据库的整体综合信息. */ public interface Dat…
周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下,最后决定先把简单的test包下的东西看看一下.毕竟结构体这块有点复杂.所以这次分析个简单点的. test包下的文件并不多,代码量也非常少,总共5个文件: 1.memtest.c 内存检測 2.redis_benchmark.c 用于redis性能測试的实现. 3.redis_check_aof.c…
大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. 比一般键值对数据库强大的地方,Redis中的value支持string(字符串).hash(哈希). list(列表).set(集合).zset(有序集合).Bitmaps(位图). HyperLogLog.GEO(地理信息定位)等多种数据结构,因此 Redis可以满足很多的应用场景. 而且因为Re…
一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中统一使用zmalloc,zfree一系列函数,其相应的源代码在src/zmalloc.h和src/zmalloc.c两个文件里,源代码点这里. 二,redis内存管理源代码分析 redis封装是为了屏蔽底层平台的差异,同一时候方便自己实现相关的函数,我们能够通过src/zmalloc.h 文件里的相…
今天,我们继续redis源代码test下测试在封装中的其它文件.今天读数memtest档,翻译了,那是,memory test 存储器测试工具..可是里面的提及了非常多东西,也给我涨了非常多见识,网上关于memtest这样的类似的redis内部边缘的文件解析基本没有,所以自己从头開始学习.机器的内存检測会和机器的CPU位数有关,32位或64位会影响后面的一些宏定义參数. 首先亮出memtest中的API: /* 内存检測API */ void memtest_progress_start(cha…
他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循环冗余校验算法.CRC校验的基本思想是利用线性编码理论,在发送端依据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去. 在接收端, 则依据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出…
一.引言     上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cluster集群的状态,也可以使用Cluster Nodes 命令来详细了解Cluster集群每个节点的详细信息和关系.我们可以在主节点上增加数据.操作数据,也可以在从节点上读取数据,这些操作当然都没有问题.我们今天这篇文章主要是讲解一下如何在不停掉Cluster集群环境的情况下,动态的往集群环境中增…
今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码给大家做一一解答. redis做的性能測试时对立面的基本操作做的检測,比方Clientclient运行set.get,lpush等数据操作的性能.能够从他的測试程序能够看出: if (test_is_selected("get")) { len = redisFormatCommand(&…
一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即便如此,我们还是会简要的列出Redis中事务的实现特征: 1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行. 2). 和关系型数据库中的事务相比,在Red…
因为时间关系:本次仅仅对这三个API($.camelCase.$.contains.$.each)方法进行分析 第一个方法变量转驼峰:$.camelCase('hello-world-welcome'); 源代码: var camelize; /**  * 字符串替换  * 使用replace第二个參数带回调  */ camelize = function(str) {      return str.replace(/-+(.)?/g,           function(match, ch…
在Redis服务端的代码量真的是比較大,假设一个一个API的学习怎么实现,无疑是一种效率非常低的做法,所以我今天对服务端的实现代码的学习,重在他的运行流程上.而对于他的模块设计在上一篇中我已经分析过了.不明确的同学能够接着看上篇.所以我学习分析redis服务端的实现也是主要从main函数開始.在分析main运行流程之前,Redis的作者在这里声明了几个变量,这个我们有必要知道一下. /* Our shared "common" objects */ /* 共享的对象 */ struct…
前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据.redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件).那么这两种持久化方式有什么区别呢,改…
今天学习了Redis中比較高大上的名词,"公布订阅模式".公布订阅模式这个词在我最開始接触听说的时候是在JMS(Java Message Service)java消息服务中听说的.这个名次用通俗的一点话说.就是我订阅了这类消息,当仅仅有这类的消息进行广播发送的时候.我才会.其它的消息直接过滤,保证了一个高效的传输效率.以下切入正题.学习一下Redis是怎样实现这个公布订阅模式的.先看看里面的简单的API构造: /*------------------------------------…
昨天分析完adlist的Redis代码.今天立即马不停蹄的继续学习Redis代码中的哈希部分的结构学习,只是在这里他不叫什么hashMap,而是叫dict.并且是一种全新设计的一种哈希结构,他仅仅是通过几个简单的结构体.再搭配上一些比較常见的哈希算法,就实现了类似高级语言中HashMap的作用了.也让我见识了一些哈希算法的实现.比方dbj hash的算法实现.俗称times33,算法,就是不停的*33,.这样的算是一种超级简单的哈希算法. 以下说说给我感觉Redis代码中哈希实现的不是那么简单.…
这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节约内存定制的数据结构,包含后面将要阅读的压缩列表. intset是一个有序的整数集,提供了添加,删除,查找的接口,针对uint16_t uint32_t uint64_t,提供了不同编码的转换(严格的说仅仅是类型的提升) 首先.看一下它的结构定义: typedef struct intset { u…
ziplist和之前我解析过的adlist列表名字看上去的非常像.可是作用却全然不同.之前的adlist主要针对的是普通的数据链表操作. 而今天的ziplist指的是压缩链表.为什么叫压缩链表呢.由于链表中我们一般经常使用pre.next来指明当前的结点的前一个指针或当前的结点的下一个指针,这事实上是在一定程度上占领了比較多的内存空间.ziplist採用了长度的表示方法.整个ziplist事实上是超级长的字符串,通过里面各个结点的长度.上一个结点的长度等信息,通过高速定位实现相关操作.并且编写者…
在上次的zipmap分析完之后,事实上关于redis源码结构体部分的内容事实上已经所有结束了.由于以下还有几个和结构体相关的操作类,就页把他们归并到struct包下了.这类的文件有:t_hash.c,z_list,z_set.c,t_string.c,t_zset.c,这些文件的功能事实上都差点儿相同,就是用来实现Client和Server之间的命令处理的操作类,通过robj的形式,把dict,ziplist等存入robj中,进行各个转换.实现命令操作.避开了结构体原先的复杂结构,相当于是封装了…
持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件名 dump.rdb snapshot: 快照复制. Redis在指定情况下触发快照: (1) 按配置的规则;(2) save 或 bgsave 命令执行;(3) flushall 命令; (4)执行复制 配置的规则: save seconds exchange 当在 seconds 指定的时间内,…
今天学习完了命令行client的兴许内容,总体感觉就是环绕着2个东西转,config和mode.为什么我会这么说呢,请继续往下看,client中的配置结构体和之前我们所学习的配置结构体,不是指的同一个概念.cli中的结构体除了主要的ip,Portport号,还有就是各种mode的配置了. /* Redis配置结构体 */ static struct config { char *hostip; int hostport; char *hostsocket; long repeat; long i…
[一]redis的数据为什么要持久化 --->redis的存取数据性能高,是由于将所有数据都存储在内存中.当redis重启的时候,存储在内存中的数据就容易丢失. --->把redis作为数据库使用. --->把redis作为缓存服务器,但缓存被穿透后会对性能造成很大的影响,所有缓存同时失效会导致缓存雪崩,从而使服务无法响应. --->因此我们希望redis能将数据从内存中以某种形式同步到硬盘,使得重启后可以根据硬盘中的纪录恢复数据,这一过程就叫做持久化   [二]redis的持久化…
sparkline这个单词,我第一次看的时候.也不知道这什么意思啊,曾经根本没听过啊,可是这真真实实的出如今了redis的代码中了,刚刚開始以为这也是属于普通的队列嘛.就把他分在了struct包里了. 好来分析完了.与原本我所想的差太大了.sparkline英文中的意思"微线图",这么说吧.类似于折线图,由一个一个信息点构成.所以看到这个意思.你也许就明确了sparkline.c是干什么用的了吧,就是绘图用的. 我们看看这个绘图的内部结构是什么,绘图须要的元素是哪些: /* spark…
redis作为一非关系型数据库,居然相同拥有与RDBMS的事务操作,不免让我认为比較吃惊.在redis就专门有文件就是运行事务的相关操作的.也能够让我们领略一下.在Redis的代码中是怎样实现事务操作.首先亮出mulic.c以下的一些API. /* ================================ MULTI/EXEC ============================== */ void initClientMultiState(redisClient *c) /* 初始…