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

24
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

description

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

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

Page 1: 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

Page 2: Một số ứng dụng của Redis, NoSQL tại Tamtay - PHPDay 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

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

1. Tamtay.vn

• Blog• Photo• Event• Game• …

SOCIALSOCIALContent &

Entertainment

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

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 …

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

2. Redis & NoSQL“Cặp đôi hoàn hảo”

> 1M người dùng

Memcache

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

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

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

2. Redis & NoSQL

Redis, HBase/Hadoop, Memcache

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

2. Redis & NoSQL

Một số ứng dụng

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

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

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

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.

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

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

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

2.2. Chat• Instant Webchat

• History

• Offline messages

Vấn đề:

- Realtime over HTTP

- Presence System

- Message channel

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

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

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

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

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

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_*

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

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

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

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

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

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

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

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!

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

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

… …

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

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

… …

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

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

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

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.

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

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