ваше сообщение коммита
This commit is contained in:
117
frontend/src/services/cacheService.js
Normal file
117
frontend/src/services/cacheService.js
Normal file
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* Глобальный сервис кэширования для оптимизации запросов
|
||||
*/
|
||||
|
||||
class CacheService {
|
||||
constructor() {
|
||||
this.tableCache = new Map();
|
||||
this.relationsCache = new Map();
|
||||
this.tableCacheTimeout = 30000; // 30 секунд для таблиц
|
||||
this.relationsCacheTimeout = 10000; // 10 секунд для relations
|
||||
}
|
||||
|
||||
// Кэширование данных таблиц
|
||||
getTableData(tableId, columnId = 'default') {
|
||||
const cacheKey = `${tableId}_${columnId}`;
|
||||
const cached = this.tableCache.get(cacheKey);
|
||||
|
||||
if (cached && Date.now() - cached.timestamp < this.tableCacheTimeout) {
|
||||
console.log(`[CacheService] ✅ КЭШ ПОПАДАНИЕ для таблицы ${tableId} (${cacheKey})`);
|
||||
return cached.data;
|
||||
}
|
||||
|
||||
if (cached) {
|
||||
console.log(`[CacheService] ⏰ Кэш истек для таблицы ${tableId} (${cacheKey})`);
|
||||
} else {
|
||||
console.log(`[CacheService] ❌ Кэш отсутствует для таблицы ${tableId} (${cacheKey})`);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
setTableData(tableId, columnId, data) {
|
||||
const cacheKey = `${tableId}_${columnId}`;
|
||||
this.tableCache.set(cacheKey, {
|
||||
data,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
console.log(`[CacheService] Сохранены данные таблицы ${tableId} в кэш`);
|
||||
}
|
||||
|
||||
// Кэширование relations
|
||||
getRelationsData(rowId, columnId) {
|
||||
const cacheKey = `${rowId}_${columnId}`;
|
||||
const cached = this.relationsCache.get(cacheKey);
|
||||
|
||||
if (cached && Date.now() - cached.timestamp < this.relationsCacheTimeout) {
|
||||
console.log(`[CacheService] Используем кэшированные relations для строки ${rowId}`);
|
||||
return cached.data;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
setRelationsData(rowId, columnId, data) {
|
||||
const cacheKey = `${rowId}_${columnId}`;
|
||||
this.relationsCache.set(cacheKey, {
|
||||
data,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
console.log(`[CacheService] Сохранены relations строки ${rowId} в кэш`);
|
||||
}
|
||||
|
||||
// Очистка кэша
|
||||
clearTableCache(tableId = null) {
|
||||
if (tableId) {
|
||||
// Очищаем кэш для конкретной таблицы
|
||||
for (const [key] of this.tableCache) {
|
||||
if (key.startsWith(`${tableId}_`)) {
|
||||
this.tableCache.delete(key);
|
||||
}
|
||||
}
|
||||
console.log(`[CacheService] Очищен кэш таблицы ${tableId}`);
|
||||
} else {
|
||||
// Очищаем весь кэш таблиц
|
||||
this.tableCache.clear();
|
||||
console.log('[CacheService] Очищен весь кэш таблиц');
|
||||
}
|
||||
}
|
||||
|
||||
clearRelationsCache(rowId = null) {
|
||||
if (rowId) {
|
||||
// Очищаем кэш для конкретной строки
|
||||
for (const [key] of this.relationsCache) {
|
||||
if (key.startsWith(`${rowId}_`)) {
|
||||
this.relationsCache.delete(key);
|
||||
}
|
||||
}
|
||||
console.log(`[CacheService] Очищен кэш relations строки ${rowId}`);
|
||||
} else {
|
||||
// Очищаем весь кэш relations
|
||||
this.relationsCache.clear();
|
||||
console.log('[CacheService] Очищен весь кэш relations');
|
||||
}
|
||||
}
|
||||
|
||||
// Полная очистка всех кэшей
|
||||
clearAll() {
|
||||
this.tableCache.clear();
|
||||
this.relationsCache.clear();
|
||||
console.log('[CacheService] Очищены все кэши');
|
||||
}
|
||||
|
||||
// Получение статистики кэша
|
||||
getStats() {
|
||||
return {
|
||||
tableCacheSize: this.tableCache.size,
|
||||
relationsCacheSize: this.relationsCache.size,
|
||||
tableCacheKeys: Array.from(this.tableCache.keys()),
|
||||
relationsCacheKeys: Array.from(this.relationsCache.keys())
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем единственный экземпляр
|
||||
const cacheService = new CacheService();
|
||||
|
||||
export default cacheService;
|
||||
@@ -126,6 +126,18 @@ class WebSocketService {
|
||||
this.emit('contacts-updated');
|
||||
break;
|
||||
|
||||
case 'tags-updated':
|
||||
console.log('🏷️ [WebSocket] Обновление тегов клиентов');
|
||||
this.emit('tags-updated');
|
||||
break;
|
||||
|
||||
case 'table-updated':
|
||||
console.log('[WebSocket] table-updated:', data.tableId);
|
||||
if (tableUpdateSubscribers[data.tableId]) {
|
||||
tableUpdateSubscribers[data.tableId].forEach(cb => cb(data));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
console.log('❓ [WebSocket] Неизвестный тип сообщения:', data.type);
|
||||
this.emit('unknown-message', data);
|
||||
@@ -189,4 +201,21 @@ class WebSocketService {
|
||||
// Создаем единственный экземпляр
|
||||
const websocketService = new WebSocketService();
|
||||
|
||||
export default websocketService;
|
||||
// Подписчики на обновления таблиц: tableId -> [callback]
|
||||
const tableUpdateSubscribers = {};
|
||||
|
||||
function onTableUpdate(tableId, callback) {
|
||||
if (!tableUpdateSubscribers[tableId]) {
|
||||
tableUpdateSubscribers[tableId] = [];
|
||||
}
|
||||
tableUpdateSubscribers[tableId].push(callback);
|
||||
// Возвращаем функцию для отписки
|
||||
return () => {
|
||||
tableUpdateSubscribers[tableId] = tableUpdateSubscribers[tableId].filter(cb => cb !== callback);
|
||||
};
|
||||
}
|
||||
|
||||
export default {
|
||||
websocketService,
|
||||
onTableUpdate,
|
||||
};
|
||||
Reference in New Issue
Block a user