web聊天室的设计方案

yljcqw 2012-11-25 10:05:09
这两天使用python/tornado 实现一个comet的在线聊天室,现在的大致框架是,中间层用redis,tornado将用户新消息存到redis, 客户端更新消息则由redis中取得。

因为没啥经验,想问一下,我要保存聊天记录,该如何做才好。在用户来新消息时,就写入数据库吗?这样会不会给数据库很大的压力,因为聊天消息有时候会来得很快很频繁。
好像QQ的客户端是把聊天消息记录在本地的txt文件,再做同步的。
如果大家做在线聊天室的话,会如何考虑这个呢?求提供思路。
...全文
758 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
纯属为了扯淡 2012-12-13
  • 打赏
  • 举报
回复
异步保存聊天记录
torytin 2012-12-12
  • 打赏
  • 举报
回复
如果你说的是在用户端保存消息的问题,那在用户端内存里面保存就行了,用户查看聊天记录就在本地前后翻一下就行,服务器端是一有该用户的新消息马上推送给用户并在服务器内存里面删除该聊天内容。 除非你要跟我上面说的,需要用户下次登录的时候还能看到之前的所有聊天记录,否则真没必要把聊天内容持久化
torytin 2012-12-12
  • 打赏
  • 举报
回复
在线聊天室还需要保存聊天记录么?直接存内存(redis)里面就行了吧。既然是comet的,那么一个用户给另一个用户发送消息只是在服务器中转一下而已,而且这个中转时间很短(最多是几秒的时间,很快就推送给相应的消息接收方了,人打字的速度几秒也就一两句话而已),就算每个用户预留1k大小的缓存,10万用户也就100M内存,你的这个在线聊天会有这么多同时在线用户么? 除非你需要把用户所有的聊天记录都保存在服务器端,并且支持离线消息,不然真没有必要把消息持久化
mrslikelin 2012-12-12
  • 打赏
  • 举报
回复
2.是插入本地的txt里 并且做了 发送与未发送的特殊标示 未读与已读的标示 对这些未处理的信息 做一个定向的 处理,不经过服务器 数据库 直接就发给对方(形成对讲机的形式) 减少了服务器数据库的压力
mrslikelin 2012-12-12
  • 打赏
  • 举报
回复
txt里的聊天记录是你本地的 1.服务器上的应该是数据录入服务器了的(推测 我不是太明白qq聊天工具) 插入服务器了 才会在对方哪里读取出来
超级大笨狼 2012-11-29
  • 打赏
  • 举报
回复
写库的前边加个内存队列。 写入行为心跳触发,找个安全的阀值控制写入流量。
huaye 2012-11-29
  • 打赏
  • 举报
回复
使用log4j生成聊天日志,或者自己写一个根据每个用户生成一个日志文件,然后单独使用几个线程分别处理日志到数据库。
personball 2012-11-27
  • 打赏
  • 举报
回复
不管是录入数据库还是写入文件,基本上压力就是来自频繁的IO操作 楼主需要的是一个写缓存策略吧,以一定时间间隔或一定记录数量作为阀值触发一次批量写操作就行了。
二农 2012-11-27
  • 打赏
  • 举报
回复
server端:log4j日志插件可以按天生成日志文件,聊天记录按照日志生成规则写入日志文件,通过读取这些日志的内容获取聊天记录,这种方式比较方便些
Jia_H 2012-11-25
  • 打赏
  • 举报
回复
建议:中间的Server层负责这个工作就可以了。例如可以把数据先存在文件或者别的地方,然后定时/定量/压缩(根据实际情况自己确定策略)提交到数据库中就可以解决所谓数据库的压力了。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧