优化用户会话sessionId

This commit is contained in:
启航 2026-03-10 22:30:10 +08:00
parent a3ced7b444
commit 8adf745796
2 changed files with 36 additions and 8 deletions

View File

@ -1,10 +1,14 @@
package cn.qihangerp.erp.serviceImpl; package cn.qihangerp.erp.serviceImpl;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import cn.qihangerp.service.IAiConversationHistoryService;
/** /**
* 会话管理服务用于管理用户的会话ID * 会话管理服务用于管理用户的会话ID
*/ */
@ -13,6 +17,9 @@ public class SessionManager {
private static final Map<Long, String> userIdSessionMap = new ConcurrentHashMap<>(); private static final Map<Long, String> userIdSessionMap = new ConcurrentHashMap<>();
private static final Map<String, Long> sessionUserIdMap = new ConcurrentHashMap<>(); private static final Map<String, Long> sessionUserIdMap = new ConcurrentHashMap<>();
@Autowired
private IAiConversationHistoryService aiConversationHistoryService;
/** /**
* 获取或创建用户的会话ID * 获取或创建用户的会话ID
* @param userId 用户ID * @param userId 用户ID
@ -22,11 +29,28 @@ public class SessionManager {
if (userId == null) { if (userId == null) {
return null; return null;
} }
return userIdSessionMap.computeIfAbsent(userId, k -> {
String sessionId = UUID.randomUUID().toString(); // 先从内存缓存中获取
String sessionId = userIdSessionMap.get(userId);
if (sessionId != null) {
return sessionId;
}
// 内存缓存中没有从数据库中查找
List<String> sessionIds = aiConversationHistoryService.getSessionIdsByUserId(userId);
if (sessionIds != null && !sessionIds.isEmpty()) {
// 使用第一个会话ID
sessionId = sessionIds.get(0);
userIdSessionMap.put(userId, sessionId);
sessionUserIdMap.put(sessionId, userId); sessionUserIdMap.put(sessionId, userId);
return sessionId; return sessionId;
}); }
// 数据库中也没有创建新的会话ID
sessionId = UUID.randomUUID().toString();
userIdSessionMap.put(userId, sessionId);
sessionUserIdMap.put(sessionId, userId);
return sessionId;
} }
/** /**

View File

@ -37,10 +37,14 @@
</select> </select>
<select id="selectSessionIdsByUserId" parameterType="Long" resultType="String"> <select id="selectSessionIdsByUserId" parameterType="Long" resultType="String">
select distinct session_id select session_id
from ai_conversation_history from (
where user_id = #{userId} select session_id, max(create_time) as max_create_time
order by create_time desc from ai_conversation_history
where user_id = #{userId}
group by session_id
) as temp
order by max_create_time desc
</select> </select>
<delete id="deleteBySessionId" parameterType="String"> <delete id="deleteBySessionId" parameterType="String">