1. Eviction Policy là gì và tại sao cần nó?
Eviction Policy, tiếng Việt: chính sách trục xuất, là một cơ chế diễn ra khi có thêm dữ liệu được lưu vào database dẫn đến tràn bộ nhớ. Database, cụ thể là redis-server, sẽ phải quyết định xem, xoá bớt dữ liệu hiện tại nó đang giữ để có bộ nhớ trống lưu dữ liệu mới vào. Tránh dẫn đến tình trạng database bị Out-Of-Memory (OOM) và khiến hệ thống tắc nghẽn.
Một số Eviction Policy phổ biến thường được biết đến là Last-In-First-Out (LIFO) của cấu trúc stack, First-In-First-Out (FIFO) của cấu trúc Queue,... Ngoài ra, với một số cấu trúc /database có lưu giữ thông tin thời gian hay thông tin lượt truy vấn, ta có một Policy cực kì quan trọng nữa là Least-Recently-Used (LRU) hay Expire Set (Hạn sử dụng).
Database redis có sẵn một số cơ chế Eviction policy, trong đó quan trọng nhất chính là LRU và Expire set.
- LRU: Loại bỏ các cặp Keys-Value theo thứ tự ít được truy vấn nhất, hay còn được mô tả là các cặp Keys-Value có thời gian idle dài nhất. Nói nôm na, Keys-Value nào ít được sử dụng sẽ bị ưu tiên xoá trước.
- Expire Set: Mỗi cặp Keys-Value sẽ có thông tin Time-To-Live (second), khi TTL trở về 0, cặp Keys-Value này sẽ bị xoá.
2. Mô tả các Eviction Policy đang có:
Use case: Eviction Policy chỉ được thực thi khi user gửi các lệnh mà kết qủa của lệnh đó sử dụng bộ nhớ vượt quá bộ nhớ tối đa đã cấp cho database. Các lệnh ở đây đa số là các lệnh ghi dữ liệu ( SADD, SET,...), và một số lệnh DEL đặc biệt.
- noeviction (default): Trả về lỗi error cho người dùng. Dẫn đến exception OOM nếu trong code.
- allkeys-lru: Xoá các keys thông qua cơ chế Least Recently Used (LRU) để cấp phát thêm bộ nhớ cho data mới.
- volatile-lru: Xoá các keys thông qua cơ chế Least Recently Used (LRU) để cấp phát thêm bộ nhớ cho data mới, các keys này là các keys có hạn sử dụng.
- allkeys-random: Xoá ngẫu nhiên các keys để cấp phát thêm bộ nhớ cho data mới.
- volatile-random: Xoá ngẫu nhiên các keys để cấp phát thêm bộ nhớ cho data mới, các keys này là các keys có hạn sử dụng.
- volatile-ttl: Xoá các keys có hạn sử dụng, xoá những keys nào còn thời gian sống (Time To Live) thấp nhất trước để cấp phát thêm bộ nhớ cho data mới.
Một số lưu ý:
Các policy volatile-lru, volatile-random, volatile-ttl sẽ trả về lỗi tương tự như policy noeviction nếu không tìm được keys nào thoả điều kiện để xoá.
Việc setup thời hạn sử dụng cho keys là tốn bộ nhớ hơn.
Khi xác định keys để xoá, Redis không thể chọn ra ứng viên keys để xoá tối ưu nhất trong toàn bộ các keys của database (sẽ rất tốn thời gian). Redis áp dụng việc xác định keys này dựa trên việc lấy mẫu ngẫu nhiên và chọn lựa dựa trên việc lấy mẫu này. Vì vậy, có thể nói, độ chính xác của các policy trên mang tính tương đối. Chúng ta có thể cải thiện bằng cách tuỳ chỉnh tăng số lần lấy mẫu lên, hoặc upgrade redis version lên bản từ 3.0 (hiện công ty đang dùng bản 6.0).
3. Một số cách sử dụng Eviction Policy:
- Sử dụng policy allkeys-lru khi ta nắm được trong database phân phối của việc truy vấn dữ liệu bị lệch nhiều. Tức là ta biết được sẽ có một nhóm data được truy vấn nhiều hơn hẳn một nhóm data còn lại. ==> allkeys-lru thường sẽ chọn và xoá những data thuộc nhóm ít bị truy vấn hơn.
- Sử dụng policy allkeys-random khi tất cả dữ liệu thường xuyên được truy vấn liên tục đều đặn, hay phân phối việc truy vấn dữ liệu là đều nhau trên tất cả dữ liệu.
- Sử dụng policy volatile-ttl nếu ta muốn có thêm điều kiện để Redis xác định keys nào nên xoá dựa trên dữ liệu Time-to-live còn lại.
4. Còn các loại Policy nào không?
Còn rất nhiều, tuy nhiên trong phạm vi bài viết này, chúng ta chưa nhắc đến.