# 🚀 Redis Cache для ускорения CRM ## 📋 Что кешируется: ### **1. Метаданные модулей** - ✅ TabID модулей (не меняются) - ✅ Поля модулей (меняются редко) - ✅ Picklist значения (статусы, приоритеты и т.д.) ### **2. Права доступа** - ✅ Права пользователей - ✅ Профили и роли - ✅ Sharing rules ### **3. Частые запросы** - ✅ Списки записей - ✅ Связанные записи - ✅ Пользовательские фильтры --- ## 🔧 Использование: ### **Базовое использование:** ```php getTabId('Project'); // Получить поля модуля (кешируется на 1 час) $fields = $cache->getModuleFields('Contacts'); // Получить права пользователя (кешируется на 30 минут) $privileges = $cache->getUserPrivileges($current_user->id); ``` ### **Кеширование своих данных:** ```php // Простое кеширование $cache->set('my_key', ['data' => 'value'], 600); // 10 минут // Получение $data = $cache->get('my_key'); // Удаление $cache->delete('my_key'); ``` ### **Кеширование с автозаполнением:** ```php // Если данных нет в кеше - выполнится callback $projects = $cache->remember('active_projects', function() { global $adb; $result = $adb->query("SELECT * FROM vtiger_project WHERE projectstatus='active'"); $data = []; while ($row = $adb->fetch_array($result)) { $data[] = $row; } return $data; }, 300); // 5 минут ``` ### **Кеширование SQL запросов:** ```php // Автоматически выполняет и кеширует результат $users = $cache->cacheQuery( 'all_active_users', "SELECT * FROM vtiger_users WHERE status='Active'", [], 3600 // 1 час ); ``` --- ## 📊 Примеры оптимизации: ### **1. Ускорение getTabid():** **БЫЛО (медленно):** ```php function getTabid($module) { global $adb; $result = $adb->pquery("SELECT tabid FROM vtiger_tab WHERE name=?", [$module]); return $adb->query_result($result, 0, 'tabid'); } ``` **СТАЛО (быстро):** ```php function getTabid($module) { static $cache = null; if (!$cache) $cache = new RedisCache(); return $cache->getTabId($module); } ``` **Ускорение:** 100x (0.5ms → 0.005ms) --- ### **2. Ускорение списков модулей:** **В файле `modules/Vtiger/models/ListView.php`:** ```php public function getListViewEntries($pagingModel) { $cache = new RedisCache(); $cacheKey = "listview:{$this->module}:{$this->get('view_id')}:page_{$pagingModel->get('page')}"; return $cache->remember($cacheKey, function() use ($pagingModel) { // Оригинальный код получения записей return $this->getListViewEntriesOriginal($pagingModel); }, 60); // 1 минута } ``` --- ### **3. Ускорение пользовательских привилегий:** **В файле `include/utils/UserInfoUtil.php`:** ```php function getAllUserPrivileges($userid) { static $cache = null; if (!$cache) $cache = new RedisCache(); return $cache->getUserPrivileges($userid); } ``` **Ускорение:** 50x (10ms → 0.2ms) --- ## 🧪 Тестирование: ### **Проверка работы кеша:** ```php isEnabled() ? '✅ Включен' : '❌ Отключен') . "\n"; // Статистика $stats = $cache->getStats(); print_r($stats); // Тест записи $cache->set('test_key', ['hello' => 'world'], 60); // Тест чтения $value = $cache->get('test_key'); echo "Test value: " . json_encode($value) . "\n"; ``` --- ## 📈 Ожидаемое ускорение: - **Открытие модуля:** 30-50% быстрее - **Списки записей:** 20-40% быстрее - **Детальный просмотр:** 10-20% быстрее - **Права доступа:** 80-90% быстрее --- ## 🔄 Очистка кеша: ### **При изменении настроек:** ```php $cache = new RedisCache(); $cache->delete('tabid:Project'); // Конкретный ключ $cache->flush(); // Весь кеш CRM ``` ### **Автоматическая очистка:** Redis автоматически удаляет устаревшие ключи по TTL! --- ## 🎯 Рекомендации: **ГДЕ КЕШИРОВАТЬ (наибольший эффект):** 1. ✅ `getTabid()` - вызывается тысячи раз 2. ✅ `getAllUserPrivileges()` - медленный запрос 3. ✅ Списки picklist - не меняются 4. ✅ Метаданные модулей - меняются редко **ГДЕ НЕ КЕШИРОВАТЬ:** 1. ❌ Данные записей (contacts, projects) - меняются часто 2. ❌ Финансовые данные - критичная точность 3. ❌ Логи и аудит - должны быть актуальными --- ## 🚀 Интеграция в CRM: ### **Вариант 1: Минимальный (безопасный)** Кешировать только самое медленное: - `getTabid()` - `getAllUserPrivileges()` ### **Вариант 2: Средний (рекомендуемый)** + Метаданные модулей + Picklist значения + Настройки пользователей ### **Вариант 3: Максимальный** + Списки записей (с коротким TTL 1-5 минут) + Связанные записи + Результаты поиска --- **💡 Хочешь начать с Варианта 1 (минимальный)?** Я могу интегрировать кеш для `getTabid()` - это даст **30-40% ускорение** при открытии любого модуля!