又一个NoSQL的文档型数据库, 之前有介绍过CouchDB, Cassandra, MongoDB最近也是异常的活跃,Slideshare上关于MongoDB的文档也是非常之多,
关于MongoDB的介绍这里就粘贴了,总之也是非常强大,MongoDB的官方网站中有相应的中文资料介绍,看这里
首先下载对应平台的版本,不用安装,直接解压就行了,这里要注意的是,
a) 要分清平台是32bit还是64bit版本的,32位版本的有单个数据库文件2G的限制
b) 在部分linux中(shitou测试了CentOS 4.4和Mac OS 10.6.2平台)启动MongoDB时会直接报出float错误的信息(CentOS 4.4), 这时需要使用对应的static版本
MongoDB的默认数据库文件目录是/data/db, 所以需要首先建立该目录,并保证MongoDB daemon启动用户可读写
shitous-MacBook:mongodb-osx-x86_64-1.4.2 lilei$ pwd /usr/local/mongodb-osx-x86_64-1.4.2 shitous-MacBook:mongodb-osx-x86_64-1.4.2 lilei$ sudo bin/mongod Password: bin/mongod --help for help and startup options Tue May 25 10:22:33 Mongo DB : starting : pid = 212 port = 27017 dbpath = /data/db/ master = 0 slave = 0 64-bit Tue May 25 10:22:33 db version v1.4.2, pdfile version 4.5 Tue May 25 10:22:33 git version: 53749fc2d547a3139fcf169d84d58442778ea4b0 Tue May 25 10:22:33 sys info: Darwin erh2.10gen.cc 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386 BOOST_LIB_VERSION=1_37 Tue May 25 10:22:33 waiting for connections on port 27017 Tue May 25 10:22:33 web admin interface listening on port 28017 Tue May 25 10:22:56 connection accepted from 127.0.0.1:49332 #1 Tue May 25 10:22:57 query admin.$cmd ntoreturn:1 command reslen:298 752ms
这样启动就可以了,默认管理端口为28017, 服务端口为27017
进入console
shitous-MacBook:mongodb-osx-x86_64-1.4.2 lilei$ bin/mongo MongoDB shell version: 1.4.2 url: test connecting to: test type "help" for help >
>use testdb;
>db.collection1.save({name: "shitou"});
>db.collection1.save({name: "ccok", age: 24});
>db.collection2.save({name: "shitou", sex: "male"});
>db.collection1.find(); #返回数组
{ "_id" : ObjectId("4be82d1bdc68b2484f57e441"), "name" : "shitou" }
{ "_id" : ObjectId("4be82db9dc68b2484f57e442"), "name" : "ccok", "sex" : "male" }
>db.collection1.find()[0];
{ "_id" : ObjectId("4be82d1bdc68b2484f57e441"), "name" : "shitou" }
>db.collection1.findOne({_id: ObjectId("4be82d1bdc68b2484f57e441")}) #返回一条记录
{ "_id" : ObjectId("4be82d1bdc68b2484f57e441"), "name" : "shitou" }
进一步的使用和查询使用官方的文档已经非常完整了,这里不多废话了,以后再放上具体的使用文档
顺便说下在Mac上有一个图形管理工具MongoHub, 用起来还是比较方便的
find平时用于查找文件是不可缺少的,find的用法也比较复杂,平时我们用的最多的就是:
find ./ -name "*filename*"
了, 其他一些复杂的用法平时都不怎么用到,这里列下shitou经常用的参数吧:
#找出当前目录下所有以production开头.log结尾的文件 find ./ -name "production*.log" #如果当前目录下还有其他子文件夹,但你不想递归查找子文件夹下的目录时使用 find ./ -maxdepth 1 -name "production*.log" #如果碰巧当前目录下有个匹配到"production*.log"的文件夹,而你只想要regular(一般)文件时 find ./ -maxdepth 1 -name "production*.log" -type f #找出当前目录下包含有shitou字符的文件 find ./ -maxdepth 1 -type f | xargs fgrep 'shitou' #好的,我们继续 #如果你想找最近7天创建的文件时 find ./ -maxdepth 1 -name "production*.log" -type -ctime -7 #如果你想找7天前创建的文件时 find ./ -maxdepth 1 -name "production*.log" -type -ctime +7 #下面来个正真非业余研究的 #如果你想找一个时间段内创建的文件时怎么办呢,find只支持-cnewer参数,即找到比某个文件创建时间更新的文件, #不过利用这个就够了 #首先我们创建两个文件,并且指定创建时间就为我们要寻找时间段的起至, 用于我们作为基准比较使用 touch tmp -t 201005130000 touch tmp1 -t 201005200000 #上面给定时间戳时要按照“年年年年月月日日时时分分”方式指定,好了现在就可以了 find ./ -maxdepth 1 -name "production-*log" -type f -cnewer tmp -and ! -cnewer tmp1
上面的-ctime为create time的意思,还有-atime(access time),-mtime(modify time)
-type参数还可以有d(目录),f(一版文件),等等
另外还有-group查找指定用户组的,-perm查找指定权限的(0644这样的),-size指定大小,-regex使用正则表达式
find后还可以跟管道(|),用xargs命令把查找到的文件用作后续命令的参数传递进来,看上面的例子
如来神掌打完收工
参考资料
MochiChat, 最近用Erlang写的一个基于Mochiweb的web聊天室,暂定名为MochiChat吧,特点有:
首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,一个tmp filesystem, 你可以通过这个设备向内存中读写文件, 以加快某些I/O高的操作,比如对一个大型文件频繁的open, write, read,据说oracle就利用了/dev/shm(shitou没用过oracle), 可以通过mount命令列出当前的/dev/shm的挂载的文件系统,
你可以直接对/dev/shm进行读写操作, 例如:
#touch /dev/shm/file1
既然是基于内存的文件系统,系统重启后/dev/shm下的文件就不存在了
Linux默认(CentOS)/dev/shm分区的大小是系统物理内存的50%, 虽说使用/dev/shm对文件操作的效率会高很多, 但是目前各发行软件中却很少有使用它的(除了前面提到的Oracle), 可以通过ls /dev/shm查看下面是否有文件, 如果没有就说明当前系统并没有使用该设备.
而swap是Linux的虚拟内存, 即在硬盘上开辟空间当内存不够时充当内存使用, 因此可以理解为当/dev/shm空间不够时可以占用swap的空间
参考文档:
What is /dev/shm and its practical usage
when should I use it or not use it?
Erlang的gen_tcp模块packet可以指定多种参数,实现不同的数据解析方式,这里说一下line和http两种不同方式下解析的方式
代码:
-module(my_chat_server).
-export([start/1, start/0]).
start() -> start(8081).
start(Port) -> spawn_link(fun() -> start_listen(Port) end).
start_listen(Port) ->
%here
DefaultOptions = [{packet, line}, {active, false}, {reuseaddr, true}],
case gen_tcp:listen(Port, DefaultOptions) of
{ok, ListenSocket} ->
par_connect(ListenSocket);
{error, Reason} -> {error, Reason}
end.
par_connect(LS) ->
case gen_tcp:accept(LS) of
{ok, Socket} ->
spawn(fun() -> par_connect(LS) end),
io:format("accept socket connection, socket=~w~n", [Socket]),
loop(Socket);
{error, Reason} -> {eorror, Reason}
end.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Bin} ->
%do with socket...
io:format("deal socket data, socket=~w, data=~p~n", [Socket, Bin]),
loop(Socket);
{error, closed} ->
io:format("socket closed, socket=~w~n", [Socket])
end.
2> my_chat_server:start(). <0.40.0> accept socket connection, socket=#Port<0.1887> deal socket data, socket=#Port<0.1887>, data="GET / HTTP/1.1\r\n" deal socket data, socket=#Port<0.1887>, data="Host: localhost:8081\r\n" deal socket data, socket=#Port<0.1887>, data="Connection: keep-alive\r\n" deal socket data, socket=#Port<0.1887>, data="User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2\r\n" deal socket data, socket=#Port<0.1887>, data="Cache-Control: max-age=0\r\n" deal socket data, socket=#Port<0.1887>, data="Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Encoding: gzip,deflate,sdch\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Language: en-US,en;q=0.8\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" deal socket data, socket=#Port<0.1887>, data="Cookie: AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b\r\n" deal socket data, socket=#Port<0.1887>, data="\r\n"也可以在shell中用telnet来测试:
1> my_chat_server:start().
<0.34.0>
accept socket connection, socket=#Port<0.440>
deal socket data, socket=#Port<0.440>, data={http_request,'GET',
{abs_path,"/"},
{1,1}}
deal socket data, socket=#Port<0.440>, data={http_header,14,'Host',undefined,
"localhost:8081"}
deal socket data, socket=#Port<0.440>, data={http_header,2,'Connection',
undefined,"keep-alive"}
deal socket data, socket=#Port<0.440>, data={http_header,24,'User-Agent',
undefined,
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2"}
deal socket data, socket=#Port<0.440>, data={http_header,1,'Cache-Control',
undefined,"max-age=0"}
deal socket data, socket=#Port<0.440>, data={http_header,8,'Accept',
undefined,
"application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"}
deal socket data, socket=#Port<0.440>, data={http_header,10,
'Accept-Encoding',undefined,
"gzip,deflate,sdch"}
deal socket data, socket=#Port<0.440>, data={http_header,11,
'Accept-Language',undefined,
"en-US,en;q=0.8"}
deal socket data, socket=#Port<0.440>, data={http_header,9,'Accept-Charset',
undefined,
"ISO-8859-1,utf-8;q=0.7,*;q=0.3"}
deal socket data, socket=#Port<0.440>, data={http_header,50,'Cookie',
undefined,
"AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b"}
deal socket data, socket=#Port<0.440>, data=http_eoh
gen_tcp已经把数据以HTTP的方式解析,对于开发基于HTTP的应用来说非常方便,不过其实如果要开发HTTP应用的话使用mochiweb可能是更方便的实现方式
直~接~上~图~~
~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



还有一张很不错的,被打了水印,就不放出来了

just DO NOT support IE