修复用户进房缓存

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

View File

@@ -101,7 +101,7 @@ public class UserInRoomService {
jedisService.hwrite(RedisKey.user_in_room.getKey(), uid.toString(), GsonUtil.getDefGson().toJson(roomVo)); 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()); jedisService.hdel(RedisKey.user_in_room.getKey(), uid.toString());
} }