08 2012 档案
摘要:和memcached不同的是,redis没有使用第三方的事件框架,而是自己封装了io处理机制。有些细节上,redis并没有做到最优化,比如超时事件管理,redis仅仅使用了一个单链表,最新插入的超时事件放在链表头,作者在源码中也提到超时事件上的一些可以改进的地方【比如libevent超时事件采用最大堆实现】“Note that's O(N) since time events are unsorted.Possible optimizations (not needed by Redis so far, but...):1) Insert the event in order, so
阅读全文
摘要:和zipmap作为dict数据结构的备选一样,ziplist同样追求牺牲性能的情况下节省内存,毕竟redis被看做是一个in-memory的nosql工具。zipmap的源码中,印象最深的两个细节是:1. 作者为了节省内存,如果存入的value是一个能转化成int的数字串,存储的时候,ziplist会将其转换成int类型存储2. 同样为了节省内存,在存储长度的字段都是用1or5的存储方式,当被存储字段长度小于254的时候,使用一个字节,大于等于254的时候再使用额外四个字节去存储长度【吐槽一下,代码中最麻烦的那30%的代码都和这个细节有关~~~~~~如果直接用4个字节不好吗,亲?】添加了简单注
阅读全文
摘要:【请初学者作为参考,不建议高手看这个浪费时间】上一篇文章,我们抓取到了一大批代理ip,本篇文章介绍如何实现downloaderMiddleware,达到随即使用代理ip对目标网站进行抓取的。抓取的目标网站是现在炙手可热的旅游网站 www.qunar.com, 目标信息是qunar的所有seo页面,及页面的seo相关信息。qunar并没有一般网站具有的 robots.txt文件,所以无法利用列表进行抓取,但是,可以发现,qunar的seo页面主要部署在http://www.qunar.com/routes/ 下,这个页面为入口文件,由此页面及此页面上所有带有routes的链接开始递归的抓取所有带
阅读全文
摘要:双向链表~~ 代码比较容易懂,小弟只是做了简单的注释,没啥特别的,不多说了,上代码~~Adlist.h 1 #ifndef __ADLIST_H__ 2 #define __ADLIST_H__ 3 4 /* Node, List, and Iterator are the only data structures used currently. */ 5 6 typedef struct listNode { 7 struct listNode *prev; 8 struct listNode *next; 9 void *value;10 } listNode;...
阅读全文
摘要:更科学的分析见这篇文章,小弟看了之后才明白一点点的http://www.open-open.com/bbs/view/1321697543077下面几句是我自己对zipmap的理解1. zipmap是一个简单的使用字符串实现的hash表,按照作者的本意,只会包含254以内的的key-value对2. 整个redis来看,redis是一个巨大地hash表【key-value对】,只不过这个大hash表的value不只支持字符串,而是redisObject,redisObject中的void * ptr指针可以指向任何数据结构~~~【强悍的扩展性,咱可以自己添加】3. dict乃是redis实现h
阅读全文
摘要:Sds为redis的字符串操作函数,主要依赖于Zmalloc,直接贴代码Sds.hView Code 1 #ifndef __SDS_H 2 #define __SDS_H 3 4 #include <sys/types.h> 5 #include <stdarg.h> 6 7 typedef char *sds; 8 9 10 //可变长度结构体,sizeof(sdshdr)=811 struct sdshdr {12 int len;13 int free;14 char buf[];15 }; 16 17 sds sdsnewlen(const void ...
阅读全文
摘要:Zmalloc是redis的基础,redis源码的阅读从Zmalloc开始,相信这个一个愉快的旅程,读优秀的代码,就像听音乐~ 好了开始吧头文件 Zmalloc.h,没什么好说的,声明了一些函数,具体的实现见Zmalloc.c 1: #ifndef _ZMALLOC_H 2: #define _ZMALLOC_H 3: 4: void *zmalloc(size_t size); 5: void *zcalloc(size_t size); 6: void *zrealloc(void *ptr, size_t size); 7: void zfr...
阅读全文
摘要:【请初学者作为参考,不建议高手看这个浪费时间】前两篇大概讲述了scrapy的安装及工作流程。这篇文章主要以一个实例来介绍scrapy的开发流程,本想以教程自带的dirbot作为例子,但感觉大家应该最先都尝试过这个示例,应该都很熟悉,这里不赘述,所以,将用笔者自己第一个较为完整的抓取程序作为示例作为讲解。首先,要大规模抓取一个网站的内容,必要的资源便是代理ip这一资源,如果不使用代理ip,又追求抓取的速度,很可能会被被抓网站发现行踪并封掉抓取机,所以抓取大量可用的代理ip便是我们第一个任务。大概这个爬虫要实现以下三个功能:1. 抓取代理ip,端口信息2. 验证代理ip,判断其透明性3. 将可用的
阅读全文
摘要:【请初学者作为参考,不建议高手看这个浪费时间】上一篇文章里介绍了scrapy的主要优点及linux下的安装方式,此篇文章将简要介绍scrapy的爬取过程,本文大部分内容源于scrapy文档,翻译并加上了笔者自己的理解。忘记scrapy,一般所说的爬虫工作分为两个部分,downoader 和 parser:downloader输入是url列表,输出抓取到的rawdata,可能时候是html源代码,也可能是json,xml格式的数据。parser输入是第一部分输出的rawdata,根据已知的规则提取所需的info图1. 简单爬虫图1所示的是最简单的爬虫,不考虑解析url,并把rawdata中的ur
阅读全文
摘要:nginx + php-fpm 环境的部署的文章:http://blog.s135.com/nginx_php_v6/关于php-fpm的百度百科介绍:http://baike.baidu.com/view/4168033.htm笔者在实际运用这套环境中,遇到了一个诡异的问题,问题的具体描述是:浏览器同时向网站请求php页面的时候,后开始的页面需要等待前一个页面拿到response后才能开始执行。问题发现的情况是,由于网站某个页面的后台接口问题,又没有设置超时机制,导致这个页面响应龟速。 在等待这个页面的时候,再打开其他网站页面是无法打开的,要等到这个页面返回,才会执行其他页面。经过调查,将问
阅读全文
摘要:我想来到这的同行们应开看过这篇文章,强烈推荐各位先阅读一下这篇文章,这篇文章中介绍的问题,基本同样的出现在我们的网站上,并一度使我们webserver负载升高(8核负载100)到不可用状态,导致前端502问题。http://blog.s135.com/file_get_contents/按照这篇文章中的讲述的方法:1. file_get_contents 显式设置socket超时时间经过测试是不可行的,进一步的测试,发现在php-fpm + nginx的系统环境中,这种设置超时的方式是不生效的。 而在其他环境中,如apache+php-cgi的方式,超时是可以生效的。超时设置不生效的原因还不清
阅读全文
摘要:【请初学者作为参考,不建议高手看这个浪费时间】工作中经常会有这种需求,需要抓取互联网上的数据。笔者就经常遇到这种需求,一般情况下会临时写个抓取程序,但是每次遇到这种需求的时候,都几乎要重头写,特别是面临需要抓取大数量网页,并且被抓取网站有放抓取机制的时候,处理起来就会很麻烦。无意中接触到了一个开源的抓取框架scrapy,按照introduction做了第一个dirbot爬虫,觉得很方便,就小小研究了一下,并在工作中用到过几次。scrapy的文档是英文的,网上相关的说明很少,使用的过程中也遇到过很多问题,大部分都是在 stack overflow 上找到的解答,看来这个工具国外的同行们用的会更多
阅读全文

浙公网安备 33010602011771号