修复用户进房缓存

This commit is contained in:
liaozetao
2024-01-03 14:52:57 +08:00
parent 3f877ac883
commit a890509251
2 changed files with 20 additions and 28 deletions

View File

@@ -4,6 +4,8 @@ import com.accompany.business.event.room.UserOutRoomAfterRecordEvent;
import com.accompany.business.event.room.UserOutRoomEvent;
import com.accompany.business.message.room.UserOutRoomMessage;
import com.accompany.business.param.LeftChatRoomParam;
import com.accompany.business.service.user.UserInRoomService;
import com.accompany.business.vo.RoomVo;
import com.accompany.common.redis.RedisKey;
import com.accompany.core.model.Room;
import com.accompany.sharding.mapper.UserInOutRoomRecordMapper;
@@ -41,7 +43,10 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
private RMap<Long, Long> userInRoomCurrentMap;
public Long getUserRoomRemainMillsTime(Long uid, Long roomUid, Date startTime, Date endTime){
@Autowired
private UserInRoomService userInRoomService;
public Long getUserRoomRemainMillsTime(Long uid, Long roomUid, Date startTime, Date endTime) {
return baseMapper.getUserRoomRemainMillsTime(uid, roomUid, startTime, endTime);
}
@@ -49,68 +54,56 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
@Async
public void cacheRecordAndSave(LeftChatRoomParam leftChatRoomParam) {
String event = leftChatRoomParam.getEvent();
if (!isEntreRoomAction(event) && !isLeaveRoomAction(event)){
if (!isEntreRoomAction(event) && !isLeaveRoomAction(event)) {
return;
}
String uidStr = leftChatRoomParam.getAccid();
Long uid = Long.parseLong(uidStr);
Long roomId = leftChatRoomParam.getRoomId();
String roomIdStr = String.valueOf(roomId);
Room room = roomService.getRoomByRoomId(roomId);
Long roomUid = null != room? room.getUid(): null;
Long roomUid = null != room ? room.getUid() : null;
Long timestamp = leftChatRoomParam.getTimestamp();
RSet<Long> roomSet = redissonClient.getSet(RedisKey.user_in_out_room_record.getKey(uidStr, roomIdStr));
if (isEntreRoomAction(event)){
if (isEntreRoomAction(event)) {
if (null != roomUid) {
userInRoomCurrentMap.fastPut(uid, roomUid);
userInRoomService.saveUserInRoomCache(uid, roomService.getRoomVoByUid(roomUid));
}
roomSet.add(timestamp);
roomSet.expire(12, TimeUnit.HOURS);
log.info("[进房间开始计算时间] {} {} {}", uid, roomId, timestamp);
roomService.ownerInRoom(leftChatRoomParam);
} else if (isLeaveRoomAction(event)){
} else if (isLeaveRoomAction(event)) {
Long entreTimestamp = null;
RLock lock = redissonClient.getLock(RedisKey.user_in_out_room_lock.getKey(uidStr, roomIdStr));
boolean locked = false;
try {
locked = lock.tryLock(3, TimeUnit.SECONDS);
Optional<Long> lastInRoom = roomSet.stream().filter(inTime -> timestamp.compareTo(inTime) > 0).max(Comparator.comparingLong(Long::longValue));
if (!lastInRoom.isPresent()){
if (!lastInRoom.isPresent()) {
log.error("[出房间结束计算时间] 获取进房时间异常 {} {} {}", uid, roomId, timestamp);
return;
}
entreTimestamp = lastInRoom.get();
roomSet.remove(entreTimestamp);
} catch (InterruptedException e){
} catch (InterruptedException e) {
log.error("[出房间结束计算时间] 获取进房时间锁超时 {} {} {}", uid, roomId, timestamp, e);
} finally {
if (locked){
if (locked) {
lock.unlock();
}
}
if (null == entreTimestamp){
if (null == entreTimestamp) {
return;
}
long remainMillisecond = timestamp - entreTimestamp;
log.info("[出房间结束计算时间] {} {} {} {} {}", uid, roomId, entreTimestamp, timestamp, remainMillisecond);
userInRoomCurrentMap.fastRemove(uid);
userInRoomService.removeUserInRoomCache(uid);
roomService.ownerOrSeqUserLeftRoom(leftChatRoomParam);
UserOutRoomMessage userOutRoomMessage = new UserOutRoomMessage(uid, roomUid, entreTimestamp, timestamp, remainMillisecond);
applicationContext.publishEvent(new UserOutRoomEvent(userOutRoomMessage));
//save
UserInOutRoomRecord record = new UserInOutRoomRecord();
record.setUid(uid);
@@ -120,20 +113,19 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
record.setOutTime(new Date(timestamp));
record.setRemainTime(remainMillisecond);
save(record);
applicationContext.publishEvent(new UserOutRoomAfterRecordEvent(userOutRoomMessage));
}
}
private boolean isEntreRoomAction(String event){
private boolean isEntreRoomAction(String event) {
return "IN".equals(event);
}
private boolean isLeaveRoomAction(String event){
private boolean isLeaveRoomAction(String event) {
return "OUT".equals(event);
}
public Long getUserCurrentRoomUid(Long uid){
public Long getUserCurrentRoomUid(Long uid) {
return userInRoomCurrentMap.get(uid);
}

View File

@@ -101,7 +101,7 @@ public class UserInRoomService {
jedisService.hwrite(RedisKey.user_in_room.getKey(), uid.toString(), GsonUtil.getDefGson().toJson(roomVo));
}
private void removeUserInRoomCache(Long uid) {
public void removeUserInRoomCache(Long uid) {
jedisService.hdel(RedisKey.user_in_room.getKey(), uid.toString());
}