BAB 52. CACHING STRATEGY
Tujuan
Caching digunakan untuk mengurangi beban database, mempercepat response API, dan meningkatkan skalabilitas sistem saat jumlah pengguna bertambah.
Teknologi
| Environment | Driver | Keterangan |
|---|---|---|
| Development | file | Mudah di-debug, tidak perlu Redis |
| Production | redis | Performa tinggi, mendukung TTL dan pub/sub |
Objek yang Di-cache
| Objek | Cache Key | TTL | Invalidasi |
|---|---|---|---|
| Profil pengguna | user:{id} | 10 menit | Saat profil diupdate |
| Daftar skill | skills:all | 60 menit | Saat skill master berubah |
| Mata pelajaran | subjects:school:{id} | 24 jam | Saat admin update mapel |
| Leaderboard | leaderboard:school:{id} | 5 menit | Setelah SIS dihitung ulang |
| Dashboard statistik | dashboard:student:{id} | 5 menit | Setelah sesi selesai |
| Academic year aktif | academic_year:school:{id} | 60 menit | Saat admin ganti tahun ajaran |
| Data sekolah | school:{id} | 60 menit | Saat admin update data sekolah |
Arsitektur Cache
flowchart LR
C["📱 Client"] --> API["🌐 Laravel API"]
API --> CACHE{{"🗄️ Redis Cache"}}
CACHE -->|"Cache Hit ✅"| R1["⚡ Response\n(cepat)"]
CACHE -->|"Cache Miss ❌"| DB[("💾 MySQL")]
DB --> CACHE
CACHE --> R2["📤 Response\n(disimpan ke cache)"]
style CACHE fill:#dc2626,color:#fff
Implementasi di Laravel
// app/Modules/Students/Services/StudentService.php
public function getProfile(int $studentId): Student
{
return Cache::remember(
"user:{$studentId}",
now()->addMinutes(10),
fn () => Student::with(['user', 'classroom', 'skills'])->findOrFail($studentId)
);
}
public function updateProfile(int $studentId, array $data): Student
{
$student = $this->repository->update($studentId, $data);
// Invalidasi cache setelah update
Cache::forget("user:{$studentId}");
return $student;
}
Leaderboard Cache
// app/Modules/Leaderboard/Services/LeaderboardService.php
public function getLeaderboard(int $schoolId): Collection
{
return Cache::remember(
"leaderboard:school:{$schoolId}",
now()->addMinutes(5),
fn () => Student::where('school_id', $schoolId)
->orderByDesc('sis_score')
->limit(100)
->get()
);
}
Strategi Invalidasi Cache
Cache dihapus secara otomatis via Laravel Observer saat data berubah:
// app/Modules/Students/Observers/StudentObserver.php
class StudentObserver
{
public function updated(Student $student): void
{
Cache::forget("user:{$student->id}");
Cache::forget("leaderboard:school:{$student->school_id}");
Cache::forget("dashboard:student:{$student->id}");
}
}
Keuntungan Caching
| Keuntungan | Dampak |
|---|---|
| Kurangi query DB | Database tidak kelebihan beban |
| Response lebih cepat | User experience lebih baik |
| Scalable | Mendukung banyak pengguna bersamaan |
| Leaderboard real-time semu | Update 5 menit sekali, terasa real-time |