Redis – một ứng dụng chạy trên máy chủ cho phép tương tác nhanh với một số kiểu dữ liệu tương đối đặc biệt. Những bài toán dưới đây được giải quyết bằng Redis hoàn toàn có thể thực hiện với Memcached, tuy nhiên phải lập trình phần logic cho nó. Còn đối với Redis, chỉ cần vài dòng lệnh là xong.

redis_vs_memcached

1. Ai đang làm gì?

Đây là box ghi lại một số hành động mới nhất của thành viên trên Mạng Việt Nam. Mỗi hành động (cho phép) sẽ được lưu thành 1 items trong dữ liệu dạng LIST. Với key là AiDangLamGi chẳng hạn.

Thêm hành động mới ta dùng lệnh LPUSH – thêm 1 phần tử vào bên trái danh sách, để đảm bảo chỉ có N hành động mới nhất ta dùng lệnh LTRIM – giữ lại N phần tử trong danh sách, tính từ bên trái. Lưu ý rằng trên một LIST khi có 2 user đồng thời có hành động phải LPUSH, thì lock sẽ xảy ra.

Bài toán này tương tự với: Lấy 10 items mới nhất như comment, blog, …

2. Một comment bị xóa?

Giả sử ta đang lưu như trên với 10 comment mới nhất, nhưng có 1 comment ID nào đó bị xóa. Vậy theo logic ta phải loại nó ra khỏi 10 comment mới nhất. Để xóa 1 comment theo ID trong LIST, ta dùng lệnh LREM.

Câu hỏi đặt ra là, như vậy ta chỉ hiển thị được 9 comment mới nhất? – Giải pháp là hãy lưu nhiều hơn 10 comments mới nhất: 15, hoặc 20. 😀

3. Bảng xếp hạng 10 Missteen nhiều Like nhất

Ta thường gặp vấn đề như: Bài blog nhiều bình luận nhất, Missteen được nhiều LIKE nhất, Chơi Social Game được nhiều điểm nhất, Bạn thân với ai nhất? … đó là những bảng xếp hạng.

Những bài toán này có thể giải quyết với SORTED SETS – tập hợp có sắp xếp theo điểm của từng phần tử.

Thêm 1 phần tử dùng lệnh ZADD, Lấy top N phần tử có điểm cao nhất ZREVRANGE, Lấy thứ hạng của phần tử bất kỳ ZRANK, Tăng điểm cho 1 phần tử ZINCRBY.

4. Wall Mạng Việt Nam

Đây là một danh sách các items có tính độ hot dựa trên số lượt comment + like. Ngoài ra còn yếu tố thời gian để dòng thông tin có thể “chảy” được. Rõ ràng nó khác với Bảng Xếp Hạng mục 3. Đây là bảng xếp hạng vừa dựa trên điểm (points) vừa dựa trên thời gian (time). Công thức thường tương tự như: score = points / time^alpha

Cách làm là sự kết hợp giữa LIST và SORTED SETS:
– Mỗi lần thêm 1 feed mới ta dùng lệnh LPUSH + LTRIM như bài toán số 1 – Ai Đang Làm gì. Giữ khoảng 1000 feeds trong LIST này.
– Một tiến trình chạy ngầm lấy các feeds trong LIST để tính score của các items này, sau đó lưu vào 1 SORTED SETS với lệnh ZADD để cập nhật điểm hoặc thêm mới nếu chưa có feed đó.
– Hiển thị ta chỉ cần lôi cái SORTED SETS đó ra mà thôi.

Cái điểm đáng lưu ý nhất trong bài toán này là: Sự kết hợp giữa 2 kiểu dữ liệu và tiến trình chạy ngầm để xử lý. Việc này giúp cho tất cả mọi người đều được truy cập trên memory, và không có xử lý logic nào khi xem trang web.

5. Đếm số lượt Like, Comment, View

Bài toán này thì dễ nhất rồi. Redis có lệnh là INCRBY để tăng/giảm giá trị của 1 value.
Cái hay hơn là, nếu như số liệu đó chỉ cần đếm trong 1 khoảng thời gian (1 giờ, 1 ngày,…) ta cần lấy ra và reset số này về 0 (hoặc bất cứ số nào) thì Redis có thêm lệnh GETSET.

6. Ai đã sử dụng này hôm nay?

Đôi khi bạn cần thống kê những người đã sử dụng trong 1 ngày (hoặc 1 tiếng, 1 tuần,…) và cần biết với một người nào đó đã sử dụng trong ngày hôm đó chưa. Cách làm tương đối đơn giản với dữ liệu kiểu SETS.

Với mỗi user khi vào trang đó, bạn dùng lệnh sau để thêm user đó vào tập hợp.

SADD page:20110712:[page_id] [user_id]

Vì tập hợp bao gồm các phần tử khác nhau nên nếu người đó đã trong tập hợp rồi thì sẽ không được thêm vào nữa. 20110712 – ý chỉ ngày 12/7/2011.

Sử dụng lệnh SCARD để biết số người sử dụng hôm nay, SINTER để biết ai vào liên tục trong tuần qua, tháng qua. SISMEMBER để biết ai đó đã sử dụng trang đó chưa.

VD: Việc này có thể áp dụng để suggestion kết bạn giữa những người thường xuyên chơi Social Game với nhau. 😉 Nhắc nhở ai đó lỡ quên “thu hoạch” trong game.

7. Có bao nhiêu bạn tôi đã online trong 5 phút qua? Họ là những ai?

Ta sử dụng SETS để lưu những thành viên có hoạt động trong 5 phút qua. Mỗi phút là 1 SETS. Lưu ý để clear sau khi không dùng nữa.

SADD online:201107121352 [user_id]

201107121352 ý chỉ thời gian 13:52 ngày 12/07/2011.

Như vậy để biết 5 phút qua có những thành viên nào hoạt động, dùng lệnh SUNION theo 5 tập hợp gần nhất.

Bạn bè ta cũng lưu vào 1 tập hợp, sau đó dùng lệnh SUNION theo 5 tập hợp online gần nhất và tập bạn bè là được.

8. Pub/Sub

Tính năng Pub/Sub của Redis cho phép những người quan tâm, theo dõi trang tin của bạn luôn cập nhật được những thông tin mới nhất. Đạt được việc này dễ dàng bởi việc sử dụng lệnh SUBSCRIBE, UNSUBSCRIBE, và PUBLISH.

9. Queues – Hàng đợi

Nói chung thì người dùng ghét phải chờ đợi. Nhưng máy chủ không phải lúc nào cũng có thể xử lý hàng vạn yêu cầu cùng lúc. Và lập trình viên phải xử dụng đến hàng đợi. Sử dụng LIST và BLPOP.

10. Cache

Cách sử dụng tương tự Memcache, GET và SET.

Liên kết tham khảo

About The Author