Thiết kế website, Thiết kế web, Thiết kế web chuyên nghiệp

Site map|Hỗ trợ

Dành cho Quản trị web

Sử dụng Redis để quyết một số vấn đề thường gặp

Redis là một ứng dụng (open-source) chạy trên máy chủ cho phép lưu trữ và tương tác rất nhanh với các dữ liệu, giúp giải quyết tốt hơn trong một số vấn đề phổ biến




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.
 
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. Cái 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,... : Cái này thì dễ nhất rồi. Tương tự memcached, 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.
 
Ý kiến cá nhân tôi cho rằng cách trên tương đối rắc rối.
 
Ngoài ra những vấn đề khác mà Antirez nêu ra tôi cho rằng tương đối dễ hiểu hoặc bị trùng lặp, không có gì mới.
 
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.
 
Cache Cách sử dụng tương tự Memcache, GET và SET.

Bình luận