🔴 Redisson là gì? Hiểu một lần, nhớ luôn!
Khi học Backend và bắt đầu bước vào High Concurrency / Distributed System, bạn sẽ gặp:
Redis → Redisson → Distributed Lock
Nhưng 3 khái niệm này liên quan với nhau như thế nào?
Hãy hiểu theo logic từ dưới lên.
1️⃣ Redis là gì?
Đầu tiên, hãy xem Redis đơn giản như một kho dữ liệu dùng chung.
Redis
┌──────────────────┐
│ │
│ user:123 │
│ order:456 │
│ product:789 │
│ lock:product:789 │
│ │
└──────────────────┘
Các Backend Server có thể cùng truy cập Redis:
┌──────────────┐
│ Load Balancer│
└───────┬──────┘
│
┌────────┼────────┐
▼ ▼ ▼
Server A Server B Server C
│ │ │
└────────┼────────┘
▼
Redis
Điểm quan trọng:
Redis nằm bên ngoài application, vì vậy nhiều server có thể cùng nhìn thấy một trạng thái.
2️⃣ Vấn đề bắt đầu xuất hiện khi có nhiều Server
Giả sử sản phẩm chỉ còn:
Stock = 1
Có 2 user cùng mua.
User A ──► Server A
│
│ read stock = 1
▼
Database
User B ──► Server B
│
│ read stock = 1
▼
Database
Cả hai server đều thấy:
stock = 1
Sau đó:
Server A → giảm stock
Server B → giảm stock
Kết quả:
❌ Stock âm
❌ Overselling
❌ Duplicate processing
❌ Race Condition
Đây chính là lúc chúng ta cần coordination giữa các server.
3️⃣ Distributed Lock xuất hiện
Ý tưởng rất đơn giản:
“Ai lấy được chìa khóa thì được xử lý.”
Redis
┌─────────────┐
│ │
│ product:789 │
│ LOCK │
│ │
└──────┬──────┘
│
┌─────────┴─────────┐
▼ ▼
Server A Server B
│ │
Acquire Acquire
│ │
▼ ▼
🔑 LOCK ⏳ WAIT
│
Process
│
▼
Release
│
└──────────────► Server B
│
▼
Process
Server A lấy được lock.
Server B phải chờ.
Đây gọi là:
Distributed Lock
4️⃣ Nhưng tự implement Distributed Lock rất dễ sai
Bạn có thể nghĩ:
SET lock = true
Nhưng thực tế Distributed Lock phức tạp hơn.
Bạn phải quan tâm:
- Lock acquisition
- Atomicity
- Timeout
- Expiration
- Release lock
- Server crash
- Network failure
- Lock ownership
- Retry
- Deadlock
Ví dụ:
Server A
│
├── acquire lock
│
├── processing...
│
X── 💥 server crash
│
│
▼
Redis
│
└── Lock vẫn tồn tại?
│
▼
Deadlock
Vì vậy, thay vì tự xây mọi thứ từ Redis command, chúng ta có thể dùng:
👉 Redisson
5️⃣ Redisson là gì?
Cách nhớ đơn giản nhất:
Redis = nơi lưu trạng thái dùng chung.
Redisson = Java library giúp sử dụng Redis cho Distributed System dễ hơn.
Redis
│
│ low-level storage
▼
GET / SET / DEL / EXPIRE
Trong khi:
Redisson
│
├── RLock
├── RMap
├── RQueue
├── RSemaphore
├── RRateLimiter
└── RAtomicLong
│
▼
Redis
Redisson cung cấp các abstraction cấp cao hơn.
6️⃣ RedisTemplate vs Redisson
Đây là phần rất dễ nhầm.
RedisTemplate
Thường dùng khi bạn muốn:
Application
│
▼
RedisTemplate
│
├── GET
├── SET
├── DELETE
└── JSON
│
▼
Redis
Ví dụ:
redisTemplate.opsForValue()
.set("user:123", user);
Bạn đang trực tiếp thao tác dữ liệu Redis.
Redisson
Redisson tập trung mạnh vào distributed objects + concurrency:
Application
│
▼
RedissonClient
│
├── RLock
├── RSemaphore
├── RRateLimiter
├── RMap
├── RQueue
└── RAtomicLong
│
▼
Redis
Ví dụ:
RLock lock =
redissonClient.getLock("product:789");
lock.lock();
try {
// Critical Section
} finally {
lock.unlock();
}
Code rất giống Java concurrency.
Nhưng lock thực tế nằm trên Redis, nên các application instance khác cũng nhìn thấy nó.
7️⃣ Hãy nhớ bằng một câu chuyện
Hãy tưởng tượng có một phòng họp.
🚪 PHÒNG HỌP
│
🔑 1 KEY
│
┌─────────┴─────────┐
▼ ▼
Server A Server B
│ │
lấy key chờ key
│ │
▼ │
vào phòng │
xử lý │
│ │
▼ │
trả lại key ─────────────┘
Redis:
Cái tủ giữ chìa khóa
Redisson:
Người quản lý việc lấy/trả chìa khóa
Distributed Lock:
Chính là chìa khóa
Cách nhớ này khá hữu ích:
Redis = Shared Storage
Redisson = Distributed Toolkit
RLock = Shared Lock
8️⃣ Redisson không chỉ có Distributed Lock
Đây mới là phần thú vị.
🔒 RLock
Dùng khi:
Chỉ 1 server được xử lý
Ví dụ:
Payment
Order creation
Stock deduction
Critical update
🚦 RRateLimiter
Dùng khi muốn giới hạn request:
User
│
├── Request 1 ✓
├── Request 2 ✓
├── Request 3 ✓
├── Request 4 ✗
└── Request 5 ✗
Ví dụ:
100 requests / minute / user
Phù hợp với:
API Rate Limiting
OTP
Login
Public API
AI API
🚥 RSemaphore
Nếu Distributed Lock cho phép:
1 người vào
thì Semaphore có thể cho:
N người vào
Ví dụ:
Maximum = 10
Server A ──┐
Server B ──┤
Server C ──┤
Server D ──┤──► Resource
... │
Server J ──┘
Server K ──► WAIT
Rất hữu ích khi giới hạn số lượng task chạy đồng thời.
📦 RMap
Có thể hình dung:
Java Map
↓
RMap
↓
Redis
Nhiều server cùng nhìn thấy một distributed map.
🔢 RAtomicLong
Có thể dùng cho các counter phân tán:
Server A ──┐
Server B ──┼──► Atomic Counter
Server C ──┘
Ví dụ:
Total views
Order count
Sequence number
9️⃣ Tổng quan Redisson
Có thể nhớ bằng diagram này:
Redisson
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
Concurrency Data Control
│ │ │
├─ RLock ├─ RMap ├─ RateLimiter
├─ Semaphore ├─ RSet └─ ...
└─ RWLock └─ Queue
│
▼
Redis
🔟 Redisson nằm ở đâu trong kiến trúc Backend?
Một kiến trúc phổ biến:
Internet
│
▼
┌─────────────┐
│Load Balancer│
└──────┬──────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
Backend 1 Backend 2 Backend 3
│ │ │
└────────────┼────────────┘
│
┌────────┴────────┐
▼ ▼
Database Redis
▲
│
Redisson
│
┌──────────┼──────────┐
│ │ │
Lock RateLimit Semaphore
Database vẫn là nơi lưu business data.
Redis + Redisson chủ yếu hỗ trợ:
Coordination
Caching
Concurrency
Rate Limiting
Distributed State
1️⃣1️⃣ Khi nào nên dùng RedisTemplate?
Nếu bài toán là:
“Tôi cần lưu/đọc dữ liệu từ Redis.”
Hãy nghĩ:
RedisTemplate
Ví dụ:
Cache
Session
Temporary data
JSON object
TTL
1️⃣2️⃣ Khi nào nghĩ đến Redisson?
Nếu bài toán là:
“Nhiều server cần phối hợp với nhau.”
Hãy nghĩ:
Redisson
Ví dụ:
Problem
│
┌─────────┴─────────┐
▼ ▼
Shared Data Coordination
│ │
▼ ▼
RedisTemplate Redisson
│
┌──────────────┼─────────────┐
▼ ▼ ▼
Lock RateLimiter Semaphore
🧠 13️⃣ Công thức ghi nhớ
Chỉ cần nhớ 3 tầng:
┌─────────────────────────────────┐
│ BUSINESS LOGIC │
│ Order / Payment / Inventory │
└───────────────┬─────────────────┘
│
┌───────┴────────┐
▼ ▼
RedisTemplate Redisson
│ │
│ ├── Lock
│ ├── Rate Limit
│ ├── Semaphore
│ └── Distributed Objects
│
└──────────┬─────────┘
▼
Redis
Một câu chốt
Redis lưu trạng thái dùng chung. RedisTemplate giúp đọc/ghi trạng thái đó. Redisson giúp nhiều server phối hợp với nhau dựa trên trạng thái đó.
Và nếu đang học High Concurrency, hãy học Redisson theo thứ tự:
1. RLock
↓
2. Watchdog / Lease / Timeout
↓
3. Race Condition
↓
4. RSemaphore
↓
5. RRateLimiter
↓
6. Distributed Cache / Data Structures
Đừng học Redisson như một danh sách API. Hãy bắt đầu từ câu hỏi:
“Nếu có 3 server cùng xử lý một resource thì chuyện gì xảy ra?”
Khi hiểu được câu hỏi đó, bạn sẽ hiểu tại sao Distributed Lock, Redisson và Redis tồn tại.