Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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...
Nội dung1. Tamtay.vn2. Redis & NoSQL @ Tamtay.vn   1. Cache   2. Chat   3. Friends   4. Activities Feed3. Nhận xét
1. Tamtay.vn•   Blog•   Photo•   Event•   Game•   …SOCIALContent & Entertainment
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à...
2. Redis & NoSQL“Cặp đôi hoàn hảo”> 1M người dùngMemcache
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
2. Redis & NoSQLRedis, HBase/Hadoop, Memcache
2. Redis & NoSQL    Một số ứng dụng
2.1. Cache•   Cache dữ liệu theo trang: danh sách album mới nhất•   Memcache:    •   Key: “album_list”    •   Value: PHP a...
2.1. Cache•   Redis LISTS•   List “album_list”    • Lấy page đầu tiên:        • LRange(‘album_list’, 0, 9);    • Sửa phần ...
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 v...
2.2. Chat•   Instant Webchat•   History•   Offline messagesVấn đề:-   Realtime over HTTP-   Presence System-   Message cha...
2.2. Chat          Normal POST            requests               /init                                   PHP Server       ...
2.2. ChatPresence System•Key: “<uid>_connection_count”•Value: NULL | 0 | 1 | … | n |•uid connected: INCR uid_connection_co...
2.2. ChatMessage Channel•A connect đến server: SUBSCRIBE channel_A;•B connect đến server: SUBSCRIBE channel_B;⇒Mỗi channel...
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_i...
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 frien...
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_fri...
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•...
2.4. FeedsGiải pháp:•HBase:   • Lưu trữ hàng tỷ dòng.   • Cấu trúc dòng flexible.•Table activities                        ...
2.4. Feeds• Table user_timelines      Uid                   timeline  5          timeline:1355130334 = 10_1355130334      ...
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...
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 R...
THANK YOUContact: son.bui@tamtay.vnTamtay homepage: http://www.tamtay.vn/home/gemmountainCông ty cổ phần Tamtay43 làng Yên...
Upcoming SlideShare
Loading in …5
×

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

4,341 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

×