Tổng quan

Trước khi học Caching, cần tổng kết lại tất cả kỹ thuật tối ưu hiệu năng đã học. Caching là lớp tối ưu tiếp theo trong kiến trúc hệ thống — nhưng chỉ phát huy tối đa khi các tầng bên dưới đã được thiết kế hợp lý.


Kiến trúc hiện tại

                 User
                   │
                   ▼
          ┌─────────────────┐
          │ Browser / Client │
          └─────────────────┘
                   │
        Persistent Connection
        Response Compression
        Efficient Encoding
                   │
                   ▼
             Web Application
                   │
      ┌────────────┼────────────┐
      │            │            │
      ▼            ▼            ▼
 Thread Pool   Async Logging   Query Optimization
                   │
                   ▼
               Services
                   │
      ┌────────────┼────────────┐
      │            │            │
      ▼            ▼            ▼
 DB Connection  Batch I/O   Lock Strategy
      Pool
                   │
                   ▼
              Database
                   │
      ┌────────────┼────────────┐
      │            │            │
      ▼            ▼            ▼
Normalization Indexing Buffer Cache

1. Network Layer

a. Persistent Connection

Không tạo TCP/SSL connection mới cho mỗi request.

❌ Không dùng Keep Alive         ✔ Có Keep Alive

Request → TCP Handshake → SSL    TCP + SSL
Request → TCP Handshake → SSL        │
                                  Request 1
                                  Request 2
                                  Request 3

Lợi ích: Giảm TCP handshake, SSL handshake, Network Latency.

b. Response Compression

Server nén dữ liệu (Gzip, Brotli): 500 KB → 50 KB → giảm Network Transfer Time.

c. Efficient Encoding

JSON → Protocol Buffers → Avro → MessagePack

Payload nhỏ hơn, CPU xử lý nhanh hơn.


2. Service Layer

Thread Pool

Không tạo thread liên tục.

Client Requests → Thread Pool [██████████]

Lợi ích: Giảm Thread Creation Cost, kiểm soát tài nguyên.

Database Connection Pool

Services → Connection Pool [██████████] → Database

Tái sử dụng kết nối. Quan trọng: chọn đúng kích thước pool.

2 thread   → Queue rất dài
500 thread → Context Switching rất lớn
⇒ Phải cân bằng

3. Concurrency – Locking Strategy

Optimistic Lock

Read → Modify → Commit → Conflict?

Ít lock, nhanh.

Pessimistic Lock

Lock → Modify → Commit → Unlock

An toàn hơn nhưng giảm concurrency.


4. Query Optimization

Nguồn latency rất lớn.

-- Trước khi tối ưu
SELECT * FROM Orders
JOIN Customer JOIN Product JOIN Payment JOIN Shipment
-- 500 ms

-- Sau khi tối ưu (Index + Rewrite Query)
-- 20 ms

Đây thường là nơi cải thiện hiệu năng nhiều nhất.


5. Asynchronous Logging

❌ Sai                     ✔ Đúng
Request                    Request
  ↓                          ↓
Write Log                  Return Response
  ↓                          ↓
Return Response            Background Logging

User không phải chờ ghi log.


6. Batch I/O

❌ Insert × 5            ✔ Batch Insert (100 rows at once)

Giảm Network Round Trip và Disk I/O.


7. Sequential I/O

❌ Random Write          ✔ Append (Sequential Write)

Sequential Write luôn nhanh hơn Random Write.


8. Database Design

So sánh Normalization vs Denormalization

Normalization Denormalization
Ít dữ liệu Dữ liệu lặp
Ghi nhanh Đọc nhanh
JOIN nhiều JOIN ít
Tiết kiệm bộ nhớ Tốn bộ nhớ

Indexing

❌ Không Index: 1 triệu rows → Scan toàn bộ
✔ Có Index:    B-Tree → Tìm trực tiếp

Sau khi tối ưu tất cả… mới đến Caching

Database Buffer Cache

Database → Buffer Cache → Data File

MySQL, PostgreSQL, Oracle, SQL Server đều có cache riêng.

Service Cache

Request lần 1: Client → Service → Database → Memory Cache
Request lần 2: Client → Service → Memory Cache → Return

Các loại Cache khác

  • Static Content Cache: Logo, CSS, JS, Image ít thay đổi → cache rất lâu ở Browser
  • Session Cache: Redis thay vì đọc Database
  • SSL Session Cache: Reuse Session ID → không cần trao đổi key lại mỗi lần
                 Cache
                    │
     ┌──────────────┼──────────────┐
     │              │              │
     ▼              ▼              ▼
Database       Service Cache   Browser Cache
 Buffer
                    │
         ┌──────────┴──────────┐
         ▼                     ▼
    Session Cache        Static Content
                                 │
                                 ▼
                          CSS / JS / Image

Tổng kết

Những gì cần tối ưu trước khi nghĩ đến Cache

Thành phần Kỹ thuật
Network Persistent Connection, Compression, Efficient Encoding
Service Thread Pool, Connection Pool
Concurrency Optimistic/Pessimistic Lock
Database Query Optimization, Index
Logging Async Logging
I/O Batch I/O, Sequential I/O
Database Design Normalization / Denormalization

Sau đó mới đến Caching

                    Performance Optimization

                              │
      ┌───────────────────────┼────────────────────────┐
      │                       │                        │
      ▼                       ▼                        ▼
 Network Optimization   Service Optimization   Database Optimization
      │                       │                        │
      └───────────────────────┴────────────────────────┘
                              │
                              ▼
                     Efficient Architecture
                              │
                              ▼
                           Caching
                              │
      ┌───────────────┬───────────────┬────────────────┐
      ▼               ▼               ▼
  DB Buffer       Service Cache   Browser Cache
      │               │               │
      ▼               ▼               ▼
 Session Cache   Static Content   SSL Session Cache

Caching không phải là giải pháp đầu tiên để tăng hiệu năng. Một kiến trúc tốt cần tối ưu từ network, thread pool, connection pool, query, logging, I/O, database design trước. Sau khi các tầng này đã được thiết kế hợp lý, caching mới phát huy tối đa hiệu quả bằng cách giảm số lần truy cập vào những tài nguyên chậm như database hoặc mạng.