免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3857 | 回复: 12
打印 上一主题 下一主题

zvchat聊天室开发随笔 存储结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 20:29 |只看该作者 |倒序浏览
Zvchat原本是用txt文件做为存储介质的.当年用的**免费空间,根本没有提供mysql数据库的可能.所以就自己写了一套基于txt的驱动.
这个驱动是存在着问题的.虽然一度度进行完善,但是它还是在一定程度上有着极限.
我们试想一下在txt下存储结构
单文件方式存储,多文件存储.

先来说说单文件存储.
单文件存储是在一个单文件中存储一个表的内容.一个表就是一个单文件.
我使用的方法如下:
假如一列表:
Id(用户名)  +  content(用户发言的内容)   + time (时间戳记)
这是表头.
我们怎么样把它存进单文件存储结构当中去呢?
首先.定义一个间隔符,把每个列数据分隔开.再定义一个不同的间符,把每一行的数据分开.这样一行一行写下去.具体操作过程就不讲了.
完整的存储例子可能是这样的.
Data_msgs .txt
大王|+|你们好吗|+|2008/08/20|_|
小刘|+|说什么话呢?|+|2008/08/22|_|


这样的存储的问题在于:当表要存储的内容过多的时候,数据的检索,更新,删除就变的不可维护.会很慢.
重要的一点是,php有执行时间的限制,还有使用内存的限制.
所以最后会造成堵塞.不能正常的存,取,改,删数据.

多文件存储.
多文件存储,是按目录为表名,每行记录为一个单文件.一个又一个单文件构成了表的结构.
还是跟上面差不多.只是变成这样了.
Txt
大王|+|你们好吗|+|2008/08/20|_|
Txt
小刘|+|说什么话呢?|+|2008/08/22|_|

这种存储结构要优于单文件存储,性能上也要优于单文件存储.如果一定要用txt存储.那就使用这种吧.

存,取,改,都没有太大问题.删的话,单文件存储的方式是遍历文件内容来进行操作.多文件存储是遍历文件名来进行操作.不要哪条记录,删掉文件名就好.然后对文件名进行整理.

如果存储的东西过多,那么这个最后的效率,都会降下来.
用文本存储的最要命的地方在哪里?
你要自己写出数据的存取改删的过程.
如果你不是很精于此,象我一样.那么,很遗憾,你的程序,效率也不会高到哪里去.
PHP不是C++ ,所以,你没办法象其它语言一样,开发出有效的存储结构来.

文件型存储,有acess的MDB.还有sqlite.如果不是到很需要的情况下,不建议使用文本存储.
PHP自身有限制,它能使用有限的内存,在规定的执行时间内,对不超过限制大小的文件进行处理,这个过程要比用C++写就的程序要慢.同样的执行流程,肯定要慢很多.

再来说说数据库.市面上所有的数据库,多数是基于C语言来开发的.
不用我多说.它们的存储结构,和效率,都是经过时间检验的,安全性上也不知道要高过多少.

下面说正题.聊天室程序存储的开发思路.基于数据库存储.
一个百人左右的聊天室.一秒钟之内,可能有好几十条信息抛向服务器.我们的前台程序负责接收这些信息.然后检查身体,看是不是生病了,带毒.有没有攻击性.如果有,结他和谐了.然后迅速抛向数据存储接口.数据存储接口就通过管道把它交给数据库来进行储存.
这个过程必须要快.
那读取呢?我们的聊天室里边.这个界面是每隔一段很小的时间就把面面进行刷新的.以显示最新加入的信息.(聊天的内容).
我们可以用一个计数器的形式来进行刷新.
当提交的聊天记录大于十条,或者是过了五秒钟之后.进行聊天记录的缓存更新.
把所有提交的聊天记录,都给它取出来,灌入缓存文件.
客户端的请求么,就直接指向这个缓存页面.不要直接来读数据库.不然会增加额外的负担.
我们对数据库进行操作,只发生在提交新的信息给数据库.我们附加一些条件,当达到一定条件时,再执行相应的操作.
比如:当达到100条信息,就开始进行替换,从最旧的信息开始,一条条的往下替换.这样最多数据表里只存在着100条信息,聊天室.不能一直存信息下去.这些信息,会撑爆你的硬盘的.
所以采用循环更新的方式是比较理想的.
这样,基本就解决了聊天室数据存储的问题.
主要理念就是存储要快.不能让一个信息丢掉了.不然人家就会很郁闷,怎么看不到我说的话啊.这是聊天室程序首先要解决的问题.Txt文本的存储方式,经常碰到丢包的现象.我想数据库的存储肯定要好一些.
显示聊天记录时,不必要直接读取数据库.因为这样会带来额外的负担.我们可以设定一个时间:三秒或五秒钟的间隔,或当提交了超过十条的聊天信息,我们再在提交信息之后,把缓存文件更新一下.

Over.收尾了.这是存储这一块.以后的存储,采用什么样的方式,来改进效率,到时再想想.
此路我开,此树我栽,要从此过,留下财来,但若不从,管杀不埋.

评分

参与人数 1可用积分 +5 收起 理由
HonestQiao + 5 不错不错,多多努力!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-08-28 15:23 |只看该作者
沙发也~~ 支持下~~

论坛徽章:
0
3 [报告]
发表于 2008-08-28 15:32 |只看该作者
路过,支持

论坛徽章:
0
4 [报告]
发表于 2008-08-28 17:36 |只看该作者
实在没办法,用sqlite把

论坛徽章:
0
5 [报告]
发表于 2008-09-01 18:23 |只看该作者
说啥呢?

论坛徽章:
0
6 [报告]
发表于 2008-09-01 20:15 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2008-09-02 12:28 |只看该作者
潜水很久了,被lz逼出来了,忍不住说几句。
聊天室,文本、数据库都不是好选择,而且糟糕透顶。
由于刷新快,所以不能放硬盘,如果你这样做了,恭喜你,绝对会让硬盘活不过半年。
正确的方法是申请一段内存,用来处理聊天信息。

论坛徽章:
0
8 [报告]
发表于 2008-09-02 15:27 |只看该作者
路过,了解一下呵。

论坛徽章:
0
9 [报告]
发表于 2008-09-11 16:32 |只看该作者
准备做在线聊天

...memcache刚开始了解   



我在想   能不能把聊天记录保存到客户端   使用服务器推技术  服务器只缓存几秒数据就清理掉

一会开个贴  跟高手请教下

论坛徽章:
0
10 [报告]
发表于 2008-09-11 17:35 |只看该作者
原帖由 kee212 于 2008-9-2 12:28 发表
潜水很久了,被lz逼出来了,忍不住说几句。
聊天室,文本、数据库都不是好选择,而且糟糕透顶。
由于刷新快,所以不能放硬盘,如果你这样做了,恭喜你,绝对会让硬盘活不过半年。
正确的方法是申请一段内存, ...


php能申请内存?
怎么弄?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP