Skip to content

{ Category Archives } 技术资料

嵌入式数据库系统Berkeley DB

    施聪 高级程序员、网络设计师 2005 年 4 月    BerkeleyDB是历史悠久的嵌入式数据库系统,主要应用在UNIX/LINUX操作系统上,其设计思想是简单、小巧、可靠、高性能。本文是对DB开 发的一个入门级指南,重点讨论了DB的核心数据结构和数据访问算法,并通过实际的代码演示如何使用DB。最后有一个对DB的简单总结,并提出作者对工具选 择的一些感想。 前言 UNIX/LINUX平台下的数据库种类非常多,参考资料1中 列举了其中的大部分。通常,我们在设计UNIX/LINUX平台下的应用软件时,如果数据种类繁多,数据与数据之间关系比较复杂,就会选用一些大型的企业 级数据库系统,如DB2,ORACLE、SYBASE等,如果软件规模不大,就倾向选用如MYSQL、POSTGRESQL等中小型数据库。例如使用 PHP/PERL +MYSQL/POSTGRESQL设计网站基本上是一个很常规的做法。但是,当应用软件管理的数据类型较少(特别注意:这并不是说需要管理的数据量 小),数据管理本身不复杂,且对数据操作要求高效率,则由大名鼎鼎的Berkeley(美国加州大学伯克利分校)开发的 BerkeleyDB可能是一个很明智的选择。 DB综述 DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的 ndbm,GNU项目的gdbm),DB的第一个发行版在1991年出现,当时还包含了B+树数据访问算法。在1992年,BSDUNIX第4.4发行版 中包含了DB1.85版。基本上认为这是DB的第一个正式版。在1996年中期,Sleepycat软件公司成立,提供对DB的商业支持。在这以后,DB得到了广泛的应用,当前最新版本是4.3.27。 DB支持几乎所有的现代操作系统,如LINUX、UNIX、WINDOWS等,也提供了丰富的应用程序接口,支持C、C++、JAVA、PERL、TCL、PYTHON、PHP等。DB的应用十分广泛,在很多知名的软件中都能看到其身影。例如参考资料2中作者谈到利用DB在LINUX下实现内核级文件系统;参考资料3中通过实际测试数据说明DB提高了OPENLDAP的效率。LINUX下的软件包管理器RPM也使用DB管理软件包相关数据,可以使用命令file查看RPM数据目录/var/lib/rpm下的文件,则有形式如下的输出: Dirnames: Berkeley DB (Btree, version 9, native byte-order) Filemd5s: Berkeley DB (Hash, version 8, native byte-order) 值得注意的是DB是嵌入式数据库系统,而不是常见的关系/对象型数据库,对SQL语言不支持,也不提供数据库常见的高级功能,如存储过程,触发器等。 DB的设计思想 DB 的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用 本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空间, 没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。 DB对需要管理的数据看法很简单,DB数据库包含若干条记录,每一个记录由关键字和数据(KEY/VALUE)构成。数据可以是简单的数据类型,也可以是 复杂的数据类型,例如C语言中结构。DB对数据类型不做任何解释,完全由程序员自行处理,典型的C语言指针的”自由”风格。如果把记录看成一个有n个字段 的表,那么第1个字段为表的主键,第2–n个字段对应了其它数据。DB应用程序通常使用多个DB数据库,从某种意义上看,也就是关系数据库中的多个表。 DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。 DB的设计充分体现了UNIX的基于工具的哲学,即若干简单工具的组合可以实现强大的功能。DB的每一个基础功能模块都被设计为独立的,也即意味着其使用 领域并不局限于DB本身。例如加锁子系统可以用于非DB应用程序的通用操作,内存共享缓冲池子系统可以用于在内存中基于页面的文件缓冲。 DB核心数据结构 数据库句柄结构DB:包含了若干描述数据库属性的参数,如数据库访问方法类型、逻辑页面大小、数据库名称等;同时,DB结构中包含了大量的数据库处理函数指针,大多数形式为 (*dosomething)(DB [...]

sqlite 入门初步

译者: zhuyubing@gmail.com 这里告诉你怎么开始实验 SQLite ,这里没有长长的说明和配置。 下载代码 http://www.sqlite.org/download.html 目前的最新版本: http://www.sqlite.org/sqlite-3.4.0.tar.gz 取得一份二进制拷贝, 或者是源代码并自己编译它. 关于下载页(download) 的更多信息.     ./configure      ;#  Run the configure script make                     ;#  Run the makefile. make install 创建一个新数据库 在命令行下, 输入: “sqlite3 test.db”. 将创建一个新的数据库文件名叫”test.db”. (你可以使用不同的名字) 输入 SQL 命令在提示符下创建和写入新的数据. $ sqlite3 ex1 SQLite version 3.3.10 Enter “.help” for instructions sqlite> create table tbl1(one varchar(10), two smallint); sqlite> [...]

The MySQL C API

简介 C APIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。 MySQL C 变量类型 以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。 MYSQL 要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接。 [code=c]typedef struct st_mysql { NET           net;            /* Communication parameters */ gptr          connector_fd;   /* ConnectorFd for SSL */ char          *host,*user,*passwd,*unix_socket, *server_version,*host_info,*info,*db; unsigned int  port,client_flag,server_capabilities; unsigned int  protocol_version; unsigned int  field_count; unsigned int  server_status; unsigned long thread_id;      /* Id for connection in server */ my_ulonglong affected_rows; my_ulonglong insert_id;       [...]

分布式计算与DHT网络

引用:http://www.wikilib.com/wiki?title=DHT%E7%BD%91%E7%BB%9C 分布式散列表(英语:Distributed Hash Table,简称DHT)是分布式计算系统中的一类,用来将一个关键值(key)的集合分散到所有在分布式系统中的节点,并且可以有效地将讯息转送到唯一一个拥有查询者提供的关键值的节点(Peers)。这里的节点类似散列表中的储存位置。分布式散列表通常是为了拥有极大节点数量的系统,而且在系统的节点常常会加入或离开(例如网络断线)而设计的。在一个结构性的延展网络(overlay network)中,参加的节点需要与系统中一小部份的节点沟通,这也需要使用分布式散列表。分布式散列表可以用以建立更复杂的服务,例如分布式档案系统、点对点技术档案分享系统、合作的网页快取、多播、任播(anycast)、网域名称系统以及即时通讯等。 目录 * 1 发展背景 * 2 性质 * 3 结构 o 3.1 关键值空间分割 o 3.2 延展网络 * 4 范例 o 4.1 分布式散列表实作与协定 o 4.2 分布式散列表的应用 * 5 参见 * 6 参考资料 * 7 外部链接  发展背景 研究分布式散列表的主要动机是为了开发点对点系统,像是Napster、Gnutella及Freenet。这些系统得益于使用分散在因特网上的各项资源以提供实用的应用,特别在带宽及硬盘储存空间上,他们所提供的档案分享功能因此得到最大的好处。 这些系统使用不同的方法来解决如何找到拥有某资料的节点的问题。Napster 使用中央的索引服务器:每个节点加入网络的同时,会将他们所拥有的档案列表传送给服务器,这使得服务器可以进行搜寻并将结果回传给进行查询的节点。但中央索引服务器让整个系统易受攻击,且可能造成法律问题。于是,Gnutella 和相似的网络改用大量查询模式(flooding query model):每次搜寻都会把查询讯息广播给网络上的所有节点。虽然这个方式能够防止单点故障(single point of failure),但比起 Napster 来说却极没效率。 最后,Freenet 使用了完全分布式的系统,但它建置了一套使用经验法则的基于关键值的转送方法(key based routing)。在这个方法中,每个档案与一个关键值相结合,而拥有相似关键值的档案会倾向被相似的节点构成的集合所保管。于是查询讯息就可以根据它所提供的关键值被转送到该集合,而不需要经过所有的节点。然而,Freenet [...]

SED单行脚本快速参考

————————————————————————- SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement – 电邮:pemente[at]northpark[dot]edu 版本5.5 译者:Joe Hong – 电邮:hq00e[at]126[dot]com 在以下地址可找到本文档的最新(英文)版本: http://sed.sourceforge.net/sed1line.txt http://www.pement.org/sed/sed1line.txt 其他语言版本: 中文 – http://sed.sourceforge.net/sed1line_zh-CN.html 捷克语 – http://sed.sourceforge.net/sed1line_cz.html 荷语 – http://sed.sourceforge.net/sed1line_nl.html 法语 – http://sed.sourceforge.net/sed1line_fr.html 德语 – http://sed.sourceforge.net/sed1line_de.html 葡语 – http://sed.sourceforge.net/sed1line_pt-BR.html 文本间隔: ——– # 在每一行后面增加一空行 sed [...]

squid 日志分析

  通过日志来查看 squid 的一些基本的运行状态: 1. access.log 配置语句: logformat combined %>a %ui %un [%tl] “%rm %ru HTTP/%rv” %Hs %<st “%{Referer}>h” “%{User-Agent}>h” %Ss:%Sh:%tr cache_access_log /data1/logs/access.log combined 打下的log格式为: 125.71.196.17 – – [14/May/2008:12:16:13 +0800] “GET http://you.video.sina.com.cn/b/13441121-1212188024.html HTTP/1.1″ 200 8820 “http://you.video.sina.com.cn/” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)” TCP_MEM_HIT:NONE:21089 可以通过脚本查看一些统计信息,如各种反应状态所占的比例,通常较好的情况下HIT所占的比例(应该就是所谓的命中率)可以在70%~80%

C/C++头文件一览

C、传统 C++ #include <assert.h>    //设定插入点 #include <ctype.h>     //字符处理 #include <errno.h>     //定义错误码 #include <float.h>     //浮点数处理 #include <fstream.h>    //文件输入/输出 #include <iomanip.h>    //参数化输入/输出 #include <iostream.h>   //数据流输入/输出 #include <limits.h>    //定义各种数据类型最值常量 #include <locale.h>    //定义本地化函数 #include <math.h>     //定义数学函数 #include <stdio.h>     //定义输入/输出函数 #include <stdlib.h>    //定义杂项函数及内存分配函数 #include <string.h>    //字符串处理 #include <strstrea.h>   //基于数组的输入/输出 #include <time.h>     //定义关于时间的函数 #include <wchar.h>     //宽字符处理及输入/输出 #include <wctype.h>    //宽字符分类 ////////////////////////////////////////////////////////////////////////// 标准 C++ (同上的不再注释) #include <algorithm>    //STL 通用算法 #include <bitset>     //STL 位集容器 #include <cctype> [...]

通用排序服务daemon

通用排序服务daemon,模型示例。 情景描述: 1. 需要排序的数据以 key=>value 的形式组织 2. 数据随时到达,尽可能的做到实时排序 3. 只需保留 Top n 的数据 典型应用:各种排行榜,搜索排行,点击排行等等 算法细节: 1. 数据使用 udp 包传送 (示例中还没有加上网络操作部分) 2. mmap 内存到文件。daemon 只负责排序部分的工作,输出排序结果由其他程序读取文件完成 3. 使用结构体数组存储 Top n 的已排序部分 4. 新数据到达时,使用插入排序 Todo list: 1. 增加网络接收部分 2. 增加网络输出 daemon 3. 使用链表存储 Top n ,方便插入排序。当需要输出时使用另外一个线程或子进程将链表拷贝到 mmap 内存区 4. 多 domain 测试 5. 支持 name 为字符串的情况,key 为 name [...]

TCP 相关参数解释

For Linux 2.6 原文:http://www.cnblogs.com/OnlyXP/archive/2007/09/29/911269.html tcp_syn_retries :INTEGER 默认值是5 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的) tcp_synack_retries :INTEGER 默认值是5 对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的tcp_syn_retries来决定这个值) tcp_keepalive_time :INTEGER 默认值是7200(2小时) 当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击?tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒) tcp_keepalive_probes:INTEGER 默认值是9 TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适) tcp_keepalive_intvl:INTEGER 默认值为75 探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值) tcp_retries1 :INTEGER 默认值是3 放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 – 8分钟之间。(注意:这个值同时还决定进入的syn连接) tcp_retries2 :INTEGER 默认值为15 在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5) tcp_orphan_retries :INTEGER 默认值是7 在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 – 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans [...]

Linux iptables Man 翻译

转自:tpxcer的空间 http://hi.baidu.com/tpxc ps. 顺便做抓虾验证: {ZHUAXIA3c51521f96f54f3fcb53c6a7b30f7947Union} 用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改 iptables – [RI] chain rule num rule-specification[option] 用iptables – RI 通过规则的顺序指定 iptables -D chain rule num[option] 删除指定规则 iptables -[LFZ] [chain][option] 用iptables -LFZ 链名 [选项] iptables -[NX] chain 用 -NX 指定链 iptables -P chain target[options] 指定链的默认目标 iptables -E old-chain-name new-chain-name -E 旧的链名 新的链名 用新的链名取代旧的链名 说明 [...]