Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012
-
Upload
eddie-bui -
Category
Technology
-
view
1.247 -
download
5
description
Transcript of Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 2012
REDIS, NoSQL
PHP day
Một số ứng dụng của
ở mạng xã hội Tamtay.vn
Người trình bày: Bùi Ngọc
Sơn Hà nội, 15-12-
2012
Nội dung
1. Tamtay.vn
2. Redis & NoSQL @ Tamtay.vn
1. Cache
2. Chat
3. Friends
4. Activities Feed
3. Nhận xét
1. Tamtay.vn
• Blog• Photo• Event• Game• …
SOCIALSOCIALContent &
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ùng
Memcache
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 & NoSQL
Redis, 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ẫu nhiên (1-3)
•Thời gian trung bình:
• Redis: 0,36ms
• Memcache: 0,16ms
2.2. Chat• Instant Webchat
• History
• Offline messages
Vấn đề:
- Realtime over HTTP
- Presence System
- Message channel
2.2. Chat
PHP Server
ChatClients Proxy
Normal POSTrequests
/init
/online_list
/send_message
Long-polling request
/updates
TornadoWebServer
(Python)
Redis-Database-Message Queue System (Pub-Sub)
Backend Scripts-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
•MySQL table với 20M dòng
• Query theo uid: chậm
• Insert / delete: chậm (indexing)
uid friend_id created
1 2 1355130334
2 1 1355130334
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)_friends
Benchmark:
•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 = uid_timestamplog_id content
10_1355130334 content:type = blog.commentcontent:blog_id = 1
11_1355130335 content:type = friend.createcontent:friend_id = 12
… …
2.4. Feeds• Table user_timelines
Uid timeline
5 timeline:1355130334 = 10_1355130334timeline:1355130335 = 11_1355130335…timeline:xxxxxxxxxxxx = uid_timestamp
6 timeline:1355130334 = 10_1355130334timeline: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>_timeline
chứa danh sách các log_id theo thứ tự thời gian
3. Một số nhận xétMemcache
•Tốc độ tốt nhất
•Đơn giản và ít chức năng
Redis:
•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: [email protected]
Tamtay homepage: http://www.tamtay.vn/home/gemmountain
Công ty cổ phần Tamtay
43 làng Yên Phụ, Hà Nội