为了更好的了解HTTP协议, 特意谢了一个简单HTTP服务器, 代码只有400行. 因为很简单, 所以效率也不怎么高,
而且支持的特性也不多, 不过也可以运行, 性能跟Apache差不多.
=============================================================================================
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_INIT_SIZE 512
enum {
mickey_reading_header_stage,
mickey_writing_header_stage,
mickey_writing_body_stage,
mickey_closing_stage
};
enum {
mickey_http_ok,
mickey_http_notfound,
mickey_ht
(2011-11-09 18:11)
一,
实现原理图

(2011-10-18 00:05)
我们知道微博的访问量是非常大的,一秒钟可能有成千上万的人发布微博或者删除微博,所以数据库要承受的压力非常大,这样就可能导致数据库并发量太大而操作失败。
那么,我们考虑一下,可不可以把所有的插入操作一步一步的完成呢?也就是说等到第一个插入操作完成再做第二个插入操作呢?要实现这种情况,我们可以使用消息队列。消息队列的作用就是把大量并发操作变成线性操作。那么我们怎么使用消息队列来完成呢?如下图:

从图上可以看出,我们把所有的数据库操作都发送到消息队列中,然后让消息队列来进行对数据库的
Redis DiskStore功能预览
持久化一直是Redis的痛,内存快照的缺点是:速度慢、不能保证数据的完整性。追加(append only file)的缺点是文件会无限的增长,不利于重用。为了解决这些
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
typedef char
u1;
typedef unsigned int
u4;
#define NODE_INIT_SIZE
4
#define NODE_USED_BITS
2
#define HASH_NODE
2
(2011-08-30 21:03)
线段Hash算法原理是:通过Hash算法把Key转换成一个int类型的数字,然后按照每次比较2
与插入情况相对称,除了根结点外(根结点个数不能少于1),B树的关键字数不能少于t-1个。对于简单删除情况,如果我们定位到关键字处在某个结点中,如果这个结点中关键字个数恰好是t-1个,如果直接删除这个关键字,就会违反B树规则。
此时,需要考虑两种处理方案:
1)把这个结点与其相邻结点合并,合并时需要把父结点的一个关键字加进来,除非相邻的那个结点的关键字数也是t-1个,否则,合并后会超出2t-1的限制,同样违反B树规则。而且,因为从父结点拉下一个关键字,导致父结点的关键字数少1,如果原来父结点关键字数是t-1,那么父结点违反B树规则,这种情况下,必须进行回溯处理。(对于下图(a)初始树,删除结点Z就会出现这种情况)
2)从相邻结点借一个关键字过来,这种情况要求,相邻结点必须有多于t-1个关键字,借的过程中,需要转经父结点,否则违反B树规则。
为了避免回溯,要求我们在从树根向下搜索关键字的过程中,凡是遇到途经的结点,如果该结点的关键字数是t-1,则我们需要想办法从其他地方搞个关键字过来,使得该结点的关键
(2011-07-28 11:14)
增量hash算法
B+树是一种效率非常高的外存索引算法,但是B+树实现比较复杂。而使用hashtable作为索引要解决的问题是:怎么可以是bucket动态增长。现
在已经存在的解决方案是可扩展hash,但是此算法也比较复杂,而且当不同的key有同样的hash值的时候,会出现无限扩展的问题。下面我要介绍的增量
hash算法实现比较简单,而且效率跟B+树相当。
增量hash算法的原理很简单,就是多层bucket组成的,如下图:
一个bucket中可以拥有n个元素,而每个元素都是固定格式,如下图:
flag字段保存的是本元素属于什么类型的元素,有3种情况:
(1)
当flag等于0,表示此元素为空。
(2) 当flag等于1,表示此元素是一个指向数据记录的指针
在SNS的网站中,最核心的功能就是Feed功能,Feed就是一条twitter或一条好友动态。该功能面临的挑战是:每天产生成千上万条数据,
数据推送的需要实时性等,做网站其实最大的难点就是对海量数据和高并发的处理。本人通过对Twitter和新浪微博架构的一些资料的学习,大致了解了如何
实现一个Feed功能。一个Feed功能往往有多种实现方式,最常见的是这3种:推模式、拉模式、推拉结合模式。
推模式:
推
就是把自己的发的feed推送到每个粉丝那里,就是一条feed在数据库中存储多份,做法就将feed表按userId分库,对应粉丝Id的库中插一条记
录。这种做法的缺点就是数据量大,数据冗余太严重,如一个明星用户有1000万粉丝,那么他发一条feed,就要产生1000万条记录。Feed的推送需
要异步队列,队列的好处就是降并发,推送是需要时间的,所以一个明星发了一条feed后,当最后那个粉丝看到这条feed可能已经是几分钟后的事情了。这
种模式的优点是用户查看Feed就很容易了,根据userId查询就可以了。这种做法是牺牲大量储存空间来换取网站的查看性能。
拉模式:
拉 就是用户要查看动态时就去每个关注者那边找,然后聚合并
消息队列大家应该都听过了, 至于消息队列有什么用呢?
如果大家有个网站需要1秒钟处理10000次数据库的话, 我相信数据库是顶不住的, 这个时候可以使用消息队列:
把操作数据库的请求先保存到消息队列中, 然后通过取得消息队列的操作, 一个个的操作数据库, 这样就可以减缓数据库的负担.
kmessage, 是我最近写的一个消息队列, 其实不是队列, 而是最大堆(因为最大堆可以设置权限, 队列不行):
kmessage有以下方法:
put($data, $level = 0);
保存一个记录到消息队列中, level是队列的优先权, level越大, 这个记录就越先被访问, 如果权限一样,
那么先后顺序为不确定
get_one();
从消息队列中取得一个记录
get_list($size);
从消息队列取得$size个记录
status();
取得消息队列的状态, 形式为json: {queue_size:队列大小,
queue_mem_alloc:队列申请的内存}
close();
关闭一个连接
========================================================================
使用方法:
//----------------保存数据-------------------------