238 lines
6.3 KiB
Markdown
238 lines
6.3 KiB
Markdown
|
|
# 🚀 Redis Cache для ускорения CRM
|
|||
|
|
|
|||
|
|
## 📋 Что кешируется:
|
|||
|
|
|
|||
|
|
### **1. Метаданные модулей**
|
|||
|
|
- ✅ TabID модулей (не меняются)
|
|||
|
|
- ✅ Поля модулей (меняются редко)
|
|||
|
|
- ✅ Picklist значения (статусы, приоритеты и т.д.)
|
|||
|
|
|
|||
|
|
### **2. Права доступа**
|
|||
|
|
- ✅ Права пользователей
|
|||
|
|
- ✅ Профили и роли
|
|||
|
|
- ✅ Sharing rules
|
|||
|
|
|
|||
|
|
### **3. Частые запросы**
|
|||
|
|
- ✅ Списки записей
|
|||
|
|
- ✅ Связанные записи
|
|||
|
|
- ✅ Пользовательские фильтры
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Использование:
|
|||
|
|
|
|||
|
|
### **Базовое использование:**
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
<?php
|
|||
|
|
require_once 'crm_extensions/RedisCache.php';
|
|||
|
|
|
|||
|
|
$cache = new RedisCache();
|
|||
|
|
|
|||
|
|
// Получить tabid модуля (кешируется на 24 часа)
|
|||
|
|
$tabid = $cache->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
|
|||
|
|
<?php
|
|||
|
|
require_once 'crm_extensions/RedisCache.php';
|
|||
|
|
|
|||
|
|
$cache = new RedisCache();
|
|||
|
|
|
|||
|
|
echo "Redis cache: " . ($cache->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% ускорение** при открытии любого модуля!
|
|||
|
|
|
|||
|
|
|