文章标签 ‘memcached’

终于这个系统可以告一段落了,进过了这几天的赶工,搁置各种工作,毅然上线了这个系统,链接http://bbs.byr.cn/chat。之所以要做这个类似于omegle的东西,也只是想熟悉一下memcached的使用,下面稍微为阐述一下系统思路: 首先是交互方式的确定,以现在的web技术水平,这种web在线聊天系统还是会选用定期的轮询作为技术的出发点,基于html5的websocket长连接在近期是有些文章但我看过的demo还是没有,另外论坛的访问很大一部分都是ie浏览器,所以不可能用这么新的技术。 其次是数据的存储,当然我最初就是为了用memcached而做这个系统,当然memcached也挺适合这种短时间内高并发的读写。其实在写的过程中还考虑过用传统的关系数据库和NoSql的数据库。其实用数据库也是可行的,但是要多做一些操作,比如过期的检测,由于基于web的聊天系统对于被动断线是不可能捕捉到的,这就意味这系统需要及时踢除没有心跳的用户。使用缓存系统能很好的解决这个问题,而对于数据库则需要自行维护数据的过期。这里提到两种不同的数据库还是有本质的区别,memcached与nosql对于数据的存储本质上是一样的或者也可以把memcached也归为nosql的一种。这种数据库相比于关系数据库来说在条件查询上捉襟见肘,这就需要我们不仅维护数据还要维护数据的索引,这也是我在写的过程中渐渐发现的(原来没有做过nosql的开发)。其实用mysql的内存表来做这个应用,我想也是一种很好的选择。 技术方案确定后就是数据结构,由于是kv系统,必须自行维护数据的索引供搜索使用,每个聊天的用户都有相应一个uid作为UUID,每个用户的数据在memcached中有一条记录,也就是相应的用户对象的序列化值。一个用户的数据包括 uid:唯一确定身份的id id:用户id cuid:陌生人uid lat:last access time status:用户状态 action:用户行为 queue:消息数组 然后整个系统无非就是一个状态机,根据不同的请求跳转到不同的状态。这里说一下消息的传递,用户发送消息先存储存在自己的queue中,陌生人轮询,如果queue中存在消息就取回来并清空queue数组,这样用户消息也不会长时间的积累,系统也不保存任何用户聊天记录。 其余的就没什么好说的了,就是一些js的交互,自己js也写的够寒碜的,有点惨不忍睹的地步了。这个系统暂且就这样吧,也没有太多时间进行维护了,希望以后有人能把他做的更好。下面记录一下memcached的相关安装 memcached直接在官方网站下载源码包即可,也就是其服务器端。地址是:http://memcached.org/解压缩后 #./configure –prefix=/usr/local/memcached #make #sudo make install 值得注意的是memcached需要libevent的支持,没有的话再configure会报错,这个直接可以再源上找到,安装libevent-devel就可以了。 memcached的使用方法很简单直接运行bin下memcached即可,-h选项有详细的参数说明,我的运行参数是: memcached -d -m 128 -u root -p XXXX -c 256 -v 一般来说都是用root用户来运行,而且memcached如果监听了整个网络的话没有ACL的机制,这就意味着如果别人知道机器memcached的端口就可以直接通信了,这俨然是缺乏安全的行为。网上对此也有很多解决方法,比如说用内网的方式,memcached服务器在内网里面,这样外网的用户就不可能访问到了。当然在unix下最直接的方法就是用iptables,指定ip访问指定端口。 对于memcached的客户端,不同语言有不同的实现。在php中有两种客户端供选择memcache和memcached,后者看过去比前者功能稍多。我用的是前者,从http://pecl.php.net/package/memcache下载安装包,解压缩后 #phpize #./configure –enable-memcache #make 把编译出来的so文件在php.ini中加载即可

2010年8月13日11:35 | 2 条评论
分类: 兴趣所在
标签: ,