加载中…
新浪微博
基础资料
  • 性  别:
  • 生  日:10月18日
个人简介
抱歉,该用户没有填写任何资料
个人资料
songlye
songlye
  • 博客等级:
  • 博客积分:0
  • 博客访问:57,996
  • 关注人气:34
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
搜博主文章
访客
加载中…
评论
加载中…
留言
加载中…
博文
标签:

杂谈

分类: PHP
这本书是我多年来积累的知识,当然是指PHP。另外还有一些关于NoSQL的分析和使用,是一本PHP进阶的书籍。有兴趣的同学可以入手。



阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: Linux

为了更好的了解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

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: nosql

, 实现原理图

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: nosql

    我们知道微博的访问量是非常大的,一秒钟可能有成千上万的人发布微博或者删除微博,所以数据库要承受的压力非常大,这样就可能导致数据库并发量太大而操作失败。

 

    那么,我们考虑一下,可不可以把所有的插入操作一步一步的完成呢?也就是说等到第一个插入操作完成再做第二个插入操作呢?要实现这种情况,我们可以使用消息队列。消息队列的作用就是把大量并发操作变成线性操作。那么我们怎么使用消息队列来完成呢?如下图:



从图上可以看出,我们把所有的数据库操作都发送到消息队列中,然后让消息队列来进行对数据库的

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

redis

分类: nosql

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,则我们需要想办法从其他地方搞个关键字过来,使得该结点的关键

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

分类: C/C
增量hash算法

B+树是一种效率非常高的外存索引算法,但是B+树实现比较复杂。而使用hashtable作为索引要解决的问题是:怎么可以是bucket动态增长。现 在已经存在的解决方案是可扩展hash,但是此算法也比较复杂,而且当不同的key有同样的hash值的时候,会出现无限扩展的问题。下面我要介绍的增量 hash算法实现比较简单,而且效率跟B+树相当。

增量hash算法的原理很简单,就是多层bucket组成的,如下图:
zeng_liang_hash1.jpg

一个bucket中可以拥有n个元素,而每个元素都是固定格式,如下图:
zeng_liang_hash2.jpg

flag字段保存的是本元素属于什么类型的元素,有3种情况:
(1)        当flag等于0,表示此元素为空。
(2)        当flag等于1,表示此元素是一个指向数据记录的指针
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: PHP

在SNS的网站中,最核心的功能就是Feed功能,Feed就是一条twitter或一条好友动态。该功能面临的挑战是:每天产生成千上万条数据, 数据推送的需要实时性等,做网站其实最大的难点就是对海量数据和高并发的处理。本人通过对Twitter和新浪微博架构的一些资料的学习,大致了解了如何 实现一个Feed功能。一个Feed功能往往有多种实现方式,最常见的是这3种:推模式、拉模式、推拉结合模式。

推模式:

推 就是把自己的发的feed推送到每个粉丝那里,就是一条feed在数据库中存储多份,做法就将feed表按userId分库,对应粉丝Id的库中插一条记 录。这种做法的缺点就是数据量大,数据冗余太严重,如一个明星用户有1000万粉丝,那么他发一条feed,就要产生1000万条记录。Feed的推送需 要异步队列,队列的好处就是降并发,推送是需要时间的,所以一个明星发了一条feed后,当最后那个粉丝看到这条feed可能已经是几分钟后的事情了。这 种模式的优点是用户查看Feed就很容易了,根据userId查询就可以了。这种做法是牺牲大量储存空间来换取网站的查看性能。

拉模式:

拉 就是用户要查看动态时就去每个关注者那边找,然后聚合并

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: Linux
消息队列大家应该都听过了, 至于消息队列有什么用呢?
如果大家有个网站需要1秒钟处理10000次数据库的话, 我相信数据库是顶不住的, 这个时候可以使用消息队列:
把操作数据库的请求先保存到消息队列中, 然后通过取得消息队列的操作, 一个个的操作数据库, 这样就可以减缓数据库的负担.

kmessage, 是我最近写的一个消息队列, 其实不是队列, 而是最大堆(因为最大堆可以设置权限, 队列不行):
kmessage有以下方法:
put($data, $level = 0);
保存一个记录到消息队列中, level是队列的优先权, level越大, 这个记录就越先被访问, 如果权限一样, 那么先后顺序为不确定

get_one();
从消息队列中取得一个记录

get_list($size);
从消息队列取得$size个记录

status();
取得消息队列的状态, 形式为json: {queue_size:队列大小, queue_mem_alloc:队列申请的内存}

close();
关闭一个连接
========================================================================

使用方法:
//----------------保存数据-------------------------
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有