关于I/O的一些记录

来源:互联网 发布:ai设计软件formac 编辑:程序博客网 时间:2024/06/05 16:31
前段时间做了一个聊天系统,这个系统需要缓存一些聊天的记录,所以用到了IO。

首先,简单那说下我定义的聊天消息的数据结构,该结构包括:聊天对象ID,昵称,聊天内容等关键信息。如果是我发送给别人,ID为被聊天对象的ID,由服务端转发(同时)到相应ID的人那里,同时修改ID为我的ID,客户端接收到这个消息之后就可以拿到聊天对象的ID并进行回复了。

对于如何区分存储我和不同聊天者的聊天消息,我的做法是以聊天对象的ID作为键值对的键,值为互相的聊天记录队列(FIFO),这个记录就是上面定义的那个数据结构,包括聊天对象的ID,昵称和内容等相关信息。在点击某个聊天对象发起聊天的时候就会先拿到他的ID,在缓存键值列表中查询,如果有聊天消息,则将缓存消息显示到界面上。再定义一个脏位,用于判断是否有新的消息加入,如果没有,在用户关闭聊天界面的时候就没有必要写入本地,如果有,就写入本地。

当用户登陆的时候,就读取本地聊天缓存文件,然后JSON解密,当用户关闭聊天界面的时候就将聊天消息使用JSON加密,然后缓存到本地。

当时做这个系统的时候,以为聊天文本不会很大,IO也不会很慢,也没有对聊天消息的数量进行限制,结果在PC上是感觉不到什么,当时在手机上,当聊天消息越来越多的时候,会在登陆界面卡一阵子。查看了下聊天记录的文本,也才十几KB。

总结下这次经验教训吧。

1.以后需要用到I/O的时候一定要对数据量进行相关的限制,不能无限制的缓存,不然会导致缓存文件越来越大,I/O时间肯定也是越来越大(这也是我的QQ越用越卡的原因);

2.移动设备的I/O性能和PC的I/O性能有很大的差距,且移动端更具有多样性,应该慎重考虑;

3.不同聊天者的聊天消息可以分别缓存为一个单独的文件,而没必要使用键值对存储并将所有聊天对象的聊天消息缓存到同一个文件中,这样当需要调用哪个聊天对象的聊天记录时再去I/O,数据量小且花费的I/O时间也短,也容易管理(比如新增删除特定人的聊天记录的时候只要将文件删除即可,没有必要去操作键值列表)。

0 0
原创粉丝点击