用户在线状态实现修改

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dongyuxu342719/article/details/85071009

需求描述:由于目前的群组成员在线离线状态是通过WebSocket的建立和断开来判断的,而一个浏览器页面同一时间只能建立一个WebSocket。
因此当A用户在1群是在线状态时,在2群就是离线状态,这样B用户在2群看到的A用户就是离线状态,实际上A用户此时是可以看到B发送的消息的。
因此这种在线离线状态对于用户感知其他成员状态就没有意义,需要改为系统级的在线离线。当然群组级的在线离线对于未读消息计数还是有作用的。
因此需要将群组成员在线离线状态由根据WebSocket建立和断开判断改为系统级在线离线。
系统级在线离线,通过客户端循环发送心跳数据维持在线状态,一定时间段内未接收到心跳数据就判断为离线。
服务端实现方式:
方法1、通过一个定时任务维护一个所有用户的redis数据结构,key:userState,field:userId,value:(0|1)。
定时任务定时将所有用户的在线离线状态置为离线(value=1,或者直接从redis删除该数据)(间隔根据业务需求确定,比如1分钟执行一次,这样延迟就是1分钟)。
方法2、定义一个带过期时间的redis数据结构,key:userState,field:userId,value:(0|1)。过期时间同样根据业务需求确定(比如1分钟过期,就是延迟1分钟)
客户端实现:
客户端比较固定,需要两个轮询,这两个轮询可以放在一起,减少请求次数。
一个轮询是登录系统的用户维持在线的状态,不断发送心跳数据,告诉服务器,自己在线,具体方法就是将服务端的redis数据userState置为在线。
另一个轮询是当用户进入群组时获取其他群组成员的在线离线状态,这个方法可以通过服务端判断群组Id是否为空来判断用户是否进入群组,继而判断是否需要执行。
鉴于实现的简便性,服务端采用带过期时间的redis数据结构,避免编写定时任务。
客户端合并两个ajax轮询请求,包含发送心跳数据和获取其他群组成员的状态这两个任务,减少请求次数。

猜你喜欢

转载自blog.csdn.net/dongyuxu342719/article/details/85071009
今日推荐