Web聊天室历史记录解决方案(轻喷。。)

聊天室快速访问
之前写的Web聊天室一直没有更新了,其实还有一些功能没有完善,比如历史记录、视频对话等。这几天心血来潮,捡起之前的代码,从看起来最简单的聊天记录开始整。

开始之前

当时写这个聊天室的时候,没有考虑保存聊天记录的功能,因为当时把写的东西先跑起来实现消息发送再说,,,汗,,。 跑起来之后想了想历史记录保存的问题,第一反应是保存到数据库啊!!!就是发一条,就保存一条,执行一条SQL语句。嗯,,很直接暴力。另外查了查资料,网上的文章和帖子都说即时通讯应用的聊天记录都是不会对数据库进行频繁读写的,因为即时通讯,强调即时聊天的时候频繁地对数据库进行操作会严重影响用户体验的,尤其是用户多了之后(虽然我这个可能没人用,但我也得这么想啊)。

不存下来,那么我该怎么办?

方案的抉择

虽然我做的是一个小应用,可能也不会有人真的来用,但是吧,我的态度需要端正,我需要认真对待严谨论证功能设计。哈哈哈,,嗝。。

首先我想到qq和微信,这两货用户量那么大,肯定不会把所有人的聊天记录都保存下来的,那也太海量了,不现实。结合自己的使用经验,推知qq和微信有一部分聊天记录是保存在用户本地的,因为我家那个老电脑登录上N年前安装的qq,就能看到N年前的聊天记录,在别的电脑上就看不到了,无疑,TX在蹭我们的资源,哼😕。但是另一方面,qq消息记录可以漫游,可以知道这个近期消息也是会保存在服务器里的。(我对qq和微信的技术内幕也不清楚,只是根据自己的使用经验做出的一点点判断)

emmm,所以我也开始想蹭用户资源,直接聊天记录保存到本地,不就VANS了??是啊,可是,PC版和手机版qq是应用啊,是app,而,我这个只靠个浏览器,怎么蹭用户资源来存聊天记录??首先我想到的是cookie、session、localstorage,前面这两货首先排除掉了,cookie用于零时存储一点小数据,session用于存储用户会话,并且保存在服务器,完全不符合场景!而localstorage还凑合,用于在浏览器永久保存网站的数据,没有过期时间,适合我用来蹭用户资源。

可是,我又想到了,聊天记录保存在localstorage,那我换个浏览器,不就没了吗??是啊,这种体验挺糟糕。

看来还是得回归到服务器存储,那么我怎么做到在聊天的时候不对数据库进行操作又要保存聊天记录的呢??不对磁盘进行操作,那就对内存进行操作啊,对内存的操作是快速高效的,可以利用内存缓存聊天记录,然后在深更半夜把内存中的聊天记录保存到数据库,是一个方法嗷!!

实施

首先选用Redis用于缓存聊天记录,MySQL用于消息记录的持久保存。Redis为每对聊天设立两个缓存,数据结构都是List,一个是history缓存,只会保存最近15条缓存,并且过期时间为48小时;一个是chat缓存,用于保存这对聊天未持久化的聊天记录,过期时间为25小时。聊天时一条记录会插入到这两个List中。那么缓存的key如何设置呢?

我是这么做的,例如有id为7的用户和id为13的用户在聊天,那么Redis就会建立两个缓存,key分别为:7-13-history、7-13-chat,id小的在前。这样每对聊天缓存就有唯一的key了,每对聊天中的两个用户共用这个缓存。

那么为什么要两个缓存队列呢?
这是为了用户刚登录时消息记录获取逻辑的简单化、和定时任务时逻辑的简单化。history缓存最多只保存15条记录,在用户刚登录时,只需要获取history缓存的数据去渲染前端即可,不需要读取数据库,只有在history失效之后才从数据库中读取并放入history缓存中。另外在定时任务的时候,只需要把chat缓存中的数据全部持久化到MySQL中即可,持久化完毕后清空chat缓存,这样逻辑简单明了。

另外,在每个聊天窗口最上面,可以点击“更多聊天记录”,这样的话会去数据库分页查找最近20条记录,构成渲染完html后异步更新插入到当前聊天的div之前。

Redis宕机了怎么办

如果Redis宕机了&#

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值