Merge pull request #217 from AAEE86/1233

perf: 优化请求鉴权链路并批量化统计/调度查询
This commit is contained in:
fawney19
2026-03-10 23:31:28 +08:00
committed by GitHub
44 changed files with 2745 additions and 571 deletions

View File

@@ -49,6 +49,7 @@ const currentPage = ref(1)
const pageSize = ref(20)
const currentTime = ref(Math.floor(Date.now() / 1000))
const isPageVisible = ref(typeof document === 'undefined' ? true : !document.hidden)
const nextExpireAt = ref<number | null>(null)
// ==================== 模型映射缓存 ====================
@@ -121,6 +122,8 @@ async function fetchAffinityList(keyword?: string) {
const response = await cacheApi.listAffinities(keyword)
affinityList.value = response.items
matchedUserId.value = response.matched_user_id ?? null
currentTime.value = Math.floor(Date.now() / 1000)
pruneExpiredAffinities(currentTime.value, true)
if (keyword && response.total === 0) {
showInfo('未找到匹配的缓存记录')
@@ -238,6 +241,38 @@ function handlePageChange() {
window.scrollTo({ top: 0, behavior: 'smooth' })
}
function recalculateNextExpireAt(now: number = currentTime.value) {
let nearestExpireAt: number | null = null
for (const item of affinityList.value) {
if (!item.expire_at || item.expire_at <= now) continue
if (nearestExpireAt === null || item.expire_at < nearestExpireAt) {
nearestExpireAt = item.expire_at
}
}
nextExpireAt.value = nearestExpireAt
}
function pruneExpiredAffinities(now: number, silent = false) {
const beforeCount = affinityList.value.length
const activeItems = affinityList.value.filter(
item => item.expire_at && item.expire_at > now
)
if (activeItems.length === beforeCount) {
recalculateNextExpireAt(now)
return
}
affinityList.value = activeItems
recalculateNextExpireAt(now)
if (!silent) {
showInfo(`${beforeCount - activeItems.length} 个缓存已自动过期移除`)
}
}
// ==================== 定时器管理 ====================
function startCountdown() {
@@ -247,14 +282,8 @@ function startCountdown() {
countdownTimer = setInterval(() => {
currentTime.value = Math.floor(Date.now() / 1000)
const beforeCount = affinityList.value.length
affinityList.value = affinityList.value.filter(
item => item.expire_at && item.expire_at > currentTime.value
)
if (beforeCount > affinityList.value.length) {
const removedCount = beforeCount - affinityList.value.length
showInfo(`${removedCount} 个缓存已自动过期移除`)
if (nextExpireAt.value !== null && currentTime.value >= nextExpireAt.value) {
pruneExpiredAffinities(currentTime.value)
}
}, 1000)
}
@@ -273,6 +302,9 @@ function handleVisibilityChange() {
return
}
currentTime.value = Math.floor(Date.now() / 1000)
if (nextExpireAt.value !== null && currentTime.value >= nextExpireAt.value) {
pruneExpiredAffinities(currentTime.value)
}
startCountdown()
}

View File

@@ -245,7 +245,7 @@ const activeRequestIds = computed(() => {
const hasActiveRequests = computed(() => activeRequestIds.value.length > 0)
// 自动刷新定时器
let autoRefreshTimer: ReturnType<typeof setInterval> | null = null
let autoRefreshTimer: ReturnType<typeof setTimeout> | null = null
let globalAutoRefreshTimer: ReturnType<typeof setInterval> | null = null
let refreshInFlight: Promise<void> | null = null
const AUTO_REFRESH_INTERVAL = 1000 // 1秒刷新一次用于活跃请求
@@ -271,8 +271,10 @@ async function pollActiveRequests() {
let shouldRefresh = false
const recordMap = new Map(currentRecords.value.map(record => [record.id, record]))
for (const update of requests) {
const record = currentRecords.value.find(r => r.id === update.id)
const record = recordMap.get(update.id)
if (!record) {
// 后端返回了未知的活跃请求,触发刷新以获取完整数据
shouldRefresh = true
@@ -339,17 +341,26 @@ async function pollActiveRequests() {
}
}
function scheduleNextAutoRefresh() {
if (autoRefreshTimer) return
if (!isPageVisible.value || !hasActiveRequests.value) return
autoRefreshTimer = setTimeout(async () => {
autoRefreshTimer = null
await pollActiveRequests()
scheduleNextAutoRefresh()
}, AUTO_REFRESH_INTERVAL)
}
// 启动自动刷新
function startAutoRefresh() {
if (!isPageVisible.value) return
if (autoRefreshTimer) return
autoRefreshTimer = setInterval(pollActiveRequests, AUTO_REFRESH_INTERVAL)
scheduleNextAutoRefresh()
}
// 停止自动刷新
function stopAutoRefresh() {
if (autoRefreshTimer) {
clearInterval(autoRefreshTimer)
clearTimeout(autoRefreshTimer)
autoRefreshTimer = null
}
}