Controller
//获取视频观看在线人数
@RequestMapping("/reportVideoPlayOnline")
public ResponseVO reportVideoPlayOnline(@NotEmpty String fileId, String deviceId) {
//传入文件id和设备id
Integer count = redisComponent.reportVideoPlayOnline(fileId, deviceId);
return getSuccessResponseVO(count);
}
redisComponent.reportVideoPlayOnline(fileId, deviceId);
public Integer reportVideoPlayOnline(String fileId, String deviceId) {
//用户对应的键
String userPlayOnlineKey = String.format(Constants.REDIS_KEY_VIDEO_PLAY_COUNT_USER, fileId, deviceId);
//视频对应的键
String playOnlineCountKey = String.format(Constants.REDIS_KEY_VIDEO_PLAY_COUNT_ONLINE, fileId);
//用户刚开始看视频
if (!redisUtils.keyExists(userPlayOnlineKey)) {
//设置用户八秒的过期时间
redisUtils.setex(userPlayOnlineKey, fileId, Constants.REDIS_KEY_EXPIRES_ONE_SECONDS * 8);
//增长视频对应的在线观看人数
return redisUtils.incrementex(playOnlineCountKey, Constants.REDIS_KEY_EXPIRES_ONE_SECONDS * 10).intValue();
}
//给视频在线总数量续期
redisUtils.expire(playOnlineCountKey, Constants.REDIS_KEY_EXPIRES_ONE_SECONDS * 10);
//给播放用户续期
redisUtils.expire(userPlayOnlineKey, Constants.REDIS_KEY_EXPIRES_ONE_SECONDS * 8);
//获得当前的在线观看人数
Integer count = (Integer) redisUtils.get(playOnlineCountKey);
//默认是1人在观看
return count == null ? 1 : count;
}
RedisKeyExpirationListener
该类负责监听 Redis 中键的过期事件,并处理用户观看结束后减少视频的在线人数
@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Resource
private RedisComponent redisComponent;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
if (!key.startsWith(Constants.REDIS_KEY_VIDEO_PLAY_COUNT_ONLINE_PREIFX + Constants.REDIS_KEY_VIDEO_PLAY_COUNT_USER_PREFIX)) {
return;
}
//监听 在线用户过期的key
Integer userKeyIndex = key.indexOf(Constants.REDIS_KEY_VIDEO_PLAY_COUNT_USER_PREFIX) + Constants.REDIS_KEY_VIDEO_PLAY_COUNT_USER_PREFIX.length();
//获得对应视频的key
String fileId = key.substring(userKeyIndex, userKeyIndex + Constants.LENGTH_20);
//减少该视频当前在线观看人数的数量
redisComponent.decrementPlayOnlineCount(String.format(Constants.REDIS_KEY_VIDEO_PLAY_COUNT_ONLINE, fileId));
}
}