SpringBoot中使用Redis的zset统计用户在线信息
统计在线用户的数量,是应用很常见的需求了。如果需要精准的统计到用户是在线,离线状态,我想只有客户端和服务器通过保持一个TCP长连接来实现。如果应用本身并非一个IM应用的话,这种方式成本极高。
现在的应用都趋向于使用心跳包来标识用户是否在线。用户登录后,每隔一段时间,往服务器推送一个消息,表示当前用户在线。服务器则可以定义一个时间差,例如:3分钟内收到过客户端心跳消息,视为在线用户,
客户端每隔3分钟发送一个心跳到服务器,服务器根据会话获取到用户的ID,作为zset
的member
存入zset
,score
便是当前收到心跳的时间戳,当同一个用户第二次发送心跳的时候,就会更新他对应的score
值,由于更新是在内存,这个速度相当快。
zSet统计在线用户的实现
1.编写统计在线人数接口(这里写的是一个直播的在线有效观看人数)
Integer getPeopleSum(Integer type,Integer liveId,String uid);
2.线人数接口的实现
@Override
public Integer getPeopleSum(Integer type,Integer liveId,String uid) {
String genre;
if (type==ONE){
genre="";
}else {
genre="";
}
Calendar calendar = Calendar.getInstance();
long time = calendar.getTimeInMillis();
Calendar beforeTime = Calendar.getInstance();
beforeTime.add(Calendar.MINUTE, -3);// 3分钟之前的时间戳
long time1 = beforeTime.getTimeInMillis();
redisClient.zAdd(key,uid, time);
//获取一定时间内,在线的用户数量
long count = redisClient.zCount(key,time1,time);
return count ;
}
3.comtroller
@ApiOperation("")
@PostMapping("")
public ResultVo getPeopleSum( Integer type,
Integer liveId,
HttpServletRequest request){
String uid = getTokenUid(request);
return ResultVoUtil.success(wxLiveService.getPeopleSum(type,liveId,uid));
}
一个简单的直播在线有效用户数统计就完成啦