• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012
 

Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012

on

  • 1,433 views

Slide trình bày tại PHP Day 2012 (15/12/2012 tại Hà Nội).

Slide trình bày tại PHP Day 2012 (15/12/2012 tại Hà Nội).

Statistics

Views

Total Views
1,433
Views on SlideShare
1,433
Embed Views
0

Actions

Likes
2
Downloads
40
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012 Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012 Presentation Transcript

    • 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
    • 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à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 …
    • 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 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
    • 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.
    • 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
    • 2.2. Chat• Instant Webchat• History• Offline messagesVấn đề:- Realtime over HTTP- Presence System- Message channel
    • 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
    • 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
    • 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_*
    • 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)
    • 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
    • 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
    • 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!
    • 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 … …
    • 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 … …
    • 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
    • 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.
    • 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