1 số ứng dụng của Redis, NoSQL tại MXH Tamtay.vn

3,854 views
3,660 views

Published on

Speaker: Bùi Ngọc Sơn
Work at: Tamtay.vn

Published in: Technology

1 số ứng dụng của Redis, NoSQL tại MXH Tamtay.vn

  1. 1. Một số ứng dụng củaREDIS, NoSQLở mạng xã hội Tamtay.vn Người trình bày: Bùi Ngọc Sơn PHP day Hà nội, 15-12-2012
  2. 2. Nội dung1. Tamtay.vn2. Redis & NoSQL @ Tamtay.vn 1. Cache 2. Chat 3. Friends 4. Activities Feed3. Nhận xét
  3. 3. 1. Tamtay.vn• Blog• Photo• Event• Game• …SOCIALContent & Entertainment
  4. 4. 1. Tamtay.vnMạng xã hội – Social network• Từ năm 2007• Đến tháng 11/2012 • ~ 9m registered users • ~ 1m MAU• Cấu thành từ 3 yếu tố 1. Chủ thể (subjects): người dùng, blog, album ảnh, game … 2. Quan hệ (relationships): bạn bè, hâm mộ, sở hữu … 3. Hành động (activities): kết bạn, đăng ảnh, chơi game …
  5. 5. 2. Redis & NoSQL“Cặp đôi hoàn hảo”> 1M người dùngMemcache
  6. 6. 2. Redis & NoSQL10M người dùng?•PHP: ok•MySQL: Chậm chạp, nhiều ràng buộc•Memcache: đơn giản!=> NoSQL
  7. 7. 2. Redis & NoSQLRedis, HBase/Hadoop, Memcache
  8. 8. 2. Redis & NoSQL Một số ứng dụng
  9. 9. 2.1. Cache• Cache dữ liệu theo trang: danh sách album mới nhất• Memcache: • Key: “album_list” • Value: PHP array • album_list[0] = array(item0, item1, … item 9); • album_list[1] = array(item10, item11, … item 19); • …• Vấn đề: không linh hoạt trong việc thêm/bớt/sửa cache
  10. 10. 2.1. Cache• Redis LISTS• List “album_list” • Lấy page đầu tiên: • LRange(‘album_list’, 0, 9); • Sửa phần tử trong cache: • LSet(‘album_list, 7, $data); • Thêm dữ liệu: LPush, RPush• Mềm dẻo hơn memcache rất nhiều.• Tiết kiệm bộ nhớ cho PHP.
  11. 11. 2.1. CacheBenchmark:•30 phần tử, chia làm 3 trang (mỗi trang 10 phần tử)•Độ lớn mỗi phần tử: 1KB•Thực hiện 1.000.000 lần việc lấy dữ liệu thuộc 1 trang ngẫunhiên (1-3)•Thời gian trung bình: • Redis: 0,36ms • Memcache: 0,16ms
  12. 12. 2.2. Chat• Instant Webchat• History• Offline messagesVấn đề:- Realtime over HTTP- Presence System- Message channel
  13. 13. 2.2. Chat Normal POST requests /init PHP Server /online_list /send_message Redis Chat -Database Proxy -Message QueueClients System (Pub-Sub) Tornado Long-polling WebServer request Backend Scripts /updates (Python) -Presence System -Message Delivery System
  14. 14. 2.2. ChatPresence System•Key: “<uid>_connection_count”•Value: NULL | 0 | 1 | … | n |•uid connected: INCR uid_connection_count • 1 == uid_connection_count => uid went online•uid disconnected: DECR uid_connection_count • 0 == uid_connection_count ⇒ EXPIRE uid_connection_count 10s ⇒ uid_connection_count expired: uid went offline
  15. 15. 2.2. ChatMessage Channel•A connect đến server: SUBSCRIBE channel_A;•B connect đến server: SUBSCRIBE channel_B;⇒Mỗi channel có nhiều subscribers (mỗi user có nhiều connection đến server)•A gửi tin cho B • A: PUBLISH channel_B “nội dung chat” • B(s) được notify: “nội dung chat” from A.•Message Archive: SUBSCRIBE channel_*
  16. 16. 2.3. FriendsVấn đề:•~ 20M quan hệ bạn bè•> 2M users có ít nhất 1 bạn•Nhiều bạn nhất: ~7K uid friend_id created•MySQL table với 20M dòng 1 2 1355130334 2 1 1355130334 • Query theo uid: chậm • Insert / delete: chậm (indexing)
  17. 17. 2.3. FriendsRedis SETS•Danh sách bạn của 1 user tương ứng với 1 SET: <uid>_friends•Thêm bạn: SADD <uid>_friends friend_uid•Bớt bạn: SREM <uid>_friends friend_uid•Check bạn bè: SISMEMBER <uid>_friends friend_uid•Danh sách bạn: SMEMBERS <uid>_friends
  18. 18. 2.3. FriendsTính năng mới:•Bạn chung của A và B: • SINTER A_friends B_friends•Bạn của bạn • SUNION (SMEMBERS A_friends)_friendsBenchmark:•Lấy danh sách bạn của 1 user bất kỳ • Redis: 0,59ms • MySQL: 0.95ms
  19. 19. 2.4. FeedsVấn đề:•~1M MAU.•Log hoạt động của người dùng: đăng blog, bình luận ảnh,chơi game …•~50M Activities log / tháng•Feeds: danh sách hoạt động của bạn bè mình•Mỗi người có trung bình 2,3 bạn => 2,3 x 50M = 115M feed / tháng!•Nội dung từng feed khác nhau!
  20. 20. 2.4. FeedsGiải pháp:•HBase: • Lưu trữ hàng tỷ dòng. • Cấu trúc dòng flexible.•Table activities log_id content • log_id = uid_timestamp 10_1355130334 content:type = blog.comment content:blog_id = 1 11_1355130335 content:type = friend.create content:friend_id = 12 … …
  21. 21. 2.4. Feeds• Table user_timelines Uid timeline 5 timeline:1355130334 = 10_1355130334 timeline:1355130335 = 11_1355130335 … timeline:xxxxxxxxxxxx = uid_timestamp 6 timeline:1355130334 = 10_1355130334 timeline:1355130335 = 11_1355130335 … timeline:yyyyyyyyyyy = uid_timestamp … …
  22. 22. 2.4. FeedsVấn đề:•HBase: • Lưu trữ số lượng lớn: tốt • Đọc số lượng lớn (vài nghìn – vài triệu dòng): tốt • Đọc số lượng nhỏ: tệ!Giải pháp: Redis•Table user_timelines => mỗi user có 1 list <uid>_timelinechứa danh sách các log_id theo thứ tự thời gian
  23. 23. 3. Một số nhậnxétMemcache•Tốc độ tốt nhất•Đơn giản và ít chức năngRedis:•Mềm dẻo. Có PHP Extension support•Tương đối tốn RAM⇒Đưa dữ liệu gì lên Redis?HBase:•Lưu trữ số lượng lớn. Độ ổn định cao•Cấu trúc lưu trữ mềm dẻo => thay đổi tư duy thiết kế DB•NoSQL: thay đổi tư duy lưu trữ & truy vấn dữ liệu.
  24. 24. THANK YOUContact: son.bui@tamtay.vnTamtay homepage: http://www.tamtay.vn/home/gemmountainCông ty cổ phần Tamtay43 làng Yên Phụ, Hà Nội

×