Nội dung bài viết
Video học lập trình mỗi ngày
Cách tính toán lượt views như thế nào? Đó là một trong những câu hỏi mà đã được chọn lọc trong nhiều câu hỏi trong tuần này. Vì đây là thuật toán được nhiều anh em quan tâm, nên tôi làm kỹ vấn đề này.
Ngoài ra quảng cáo một chút, bài trước chúng ta đã đi nghiên cứu vì sao lại sử dụng redis làm giỏ hàng? Và cách triển khai nó như thế nào? Và có những khó khăn gì khi triển khai... Thì đã rõ trong video trước rồi. Có gì anh em cứ comment đặt câu hỏi, mình sẽ rep sau. Còn bây giờ chúng ta cứ vào nội dung chính của bài viết này.
Nếu bạn là người thích xem video hơn thì bạn có thể stop tại đây và lick vào link VIDEO CODE TRIỂN KHAI THUẬT TOÁN TÍNH VIEWS
Youtube, hack news, reddit đã tính lượt views thế nào?
Đầu tiên xin phép anh em, như thông lệ là chúng ta sẽ đi vào thực tế nó như thế nào và vì sao người ta lại thường xuyên thay đổi thuật toán này. Cũng như chúng ta nên thống nhất chung một số khái niệm, tránh mất đoàn kết nội bộ, vì ai cũng có thế giới quan riêng... OK vào việc. Ai cũng nói tôi hay nói dài, nhưng kệ...
Hầu như ai cũng hiểu các trang mạng xã hội như youtube, facebook, có thể hiện các chỉ số truy cập, hay tỷ lệ click vào video, nhằm tính toán mức độ phổ biến hay mực độ quan tâm của bạn bè, người xung quanh vị trí địa lý của mình, vv và mây mây. Đương nhiên anh em mình không lạ cách tính toán này là mỗi lần click videos hay xem một bài viết thì trong database
của chúng ta sẽ là +1
. Đến đây ai cũng phì cười, nói như ông thì chắc mỗi video phải lên đến cả tỷ lượt views. Vâng, đó là do bạn chưa nghe tôi trình bày hết, hãy cho tôi cơ hội, tôi sẽ trình bày kỹ hơn về thuật toán tính views. Song song với đó thì các nhà phát triển MXH phải làm nhiều việc, ngoài đưa ra các thuật toán và thay đổi hàng tuần, tháng... thì bên cạnh đó phải làm sao, làm thế nào để khắc chế được các anh gian lận bằng mọi cách.
Phương pháp tính lượt views của youtube
Nói vậy cho oai chứ tôi cũng đoán mò vậy thôi, chứ có làm cho youtube đâu mà biết mấy cái chuyện đó, chỉ có mấy ông làm trong kia mới biết mấy thứ kia. Nhưng mà theo kinh nghiệm nông cạn của tôi thì phương án sau là hiệu quả hơn hết.
Như trên kia tôi đã trình bày thì nếu như mỗi lần xem một video nào đó trên youtube thì trong database
sẽ +1 thì sai hoàn toàn. Do đó các flatform
sẽ tìm cách giới hạn lượt xem hay views của người dùng theo chính sách riêng của họ. Nhưng có một điểm chung của các hệ thống đó là giới hạn theo ip
nhưng trước hết là userid
cứ để tôi nói hết. Đến đây tôi biết các bạn sẽ ồ lên, à thì ra là vậy, mình đoán ngay từ đầu mà? Hay quá bạn ơi, bạn tuyệt quá, nhưng điều đó ai cũng biết bạn ơi. Nhưng quan trọng triển khai nó như thế nào? Để tôi phân tích nốt rồi vô code sau.
Tiếp nè, theo như thường lệ thì mỗi nền tảng sẽ giới hạn theo thời gian, ví dụ, youtube sẽ tính lại lượt view cho bạn sau 600 giây
. Điều đó có nghĩa là bạn vào xem video lúc 18:00 và xem được N giây, N ở đây có nghĩa là chính sách họ đưa ra, Đủ 30 giây thì sẽ tính view, và đương nhiên 30 giây đó chia đoạn nào thì họ không nói? Tiếp đến bạn out, rồi bạn click vào video đó lúc 18:05
nghĩa là 5 phút sau, thì đương nhiên hệ thống sẽ không tính cho bạn. Vì ở trên tôi ví dụ là 600 giây
sau, tương đương với là 10 phút
. Như vậy thì phải 18:10
bạn click vào thì nó mới tính là lượt view mới. OK đến đây thì tôi nghĩ các bạn cũng đã hiểu dần dần rồi.
Đó là nói về lý thuyết còn lấy gì mà làm? và làm như thế nào thì ngay bay giờ tôi sẽ trình bày luôn. Đó là sử dụng redis
.
Sử dụng redis tính lượt views
Điều kiện để đọc tiếp để hiểu là bạn phải hiểu cơ bản về redis
, nếu như ai chưa tìm hiểu thì có thể vào những số trước để học về Khái niệm cơ bản trong redis mà tôi đã cố gắng trình bày trong video lẫn bài viết.
Phương pháp hữu ích và tốt nhất đó chính là sử dụng redis. Đến đây thì nhiều bạn sẽ hỏi vì sao lại sử dụng redis
mà không lại là thằng khác? Ai đặt câu hỏi này thì không phải anh em của tôi cho nên xem lại tiếp các video trước.
Cụ thể chúng ta sẽ dùng hash redis
. Lấy videoId + userId
làm key
và set cho N giây hết hạn key đó. N đây chính là 600 giây ở trên đấy. Tùy theo mỗi công ty, cá nhân thì N được tự do dao động, chứ không nhất thiết phải theo tôi. Đến đây thì bất cứ khi nào user nhấp vào video thì key này sẽ được tạo trong redis
, và khi giá trị tạo return về là OK
nghĩa là hợp lệ thì anh em cũng ra sử dụng incrby
để +1 lên. Và key này tồn tại trong N giây cho đến khi expried
thì key sẽ bị xóa, lúc đó user lại click vào video thì sẽ +1 tiếp, nếu như key còn tồn tại thì sẽ xem như là không hợp lệ. Vì chưa đủ thời gian bạn ơi!
Đến đây anh em lại thắc mắc, vậy làm check kiểu đó được khi đến hàng nghìn tỷ lệ click của một user. Đương nhiên, redis đã cho chúng ta tính atom trong database, tính nguyên tử trong Db thì đã nói rõ về video Tính nguyên tử trong database anh em có thắc mắc thì qua video đó mà xem, vũ khí quá đầy đủ cho cuộc tình này.
Tại thời điểm này, có những ông tướng sẽ tinh ý và hỏi rằng, Anh ơi, anh sử dụng userId là key vậy có mấy thằng có mấy chục nghìn tài khoản thì nó làm vua luôn à anh. À đương nhiên rồi, các đại ca làm ra các nền tảng ấy cũng tính toán cả rồi, cho nên họ không dùng userId
làm key nữa mà họ chuyển qua lấy ip của user
làm key, do đó dù bạn truy cập bao nhiêu người dùng cùng một ip
, tôi sẽ tính là một. Kể cả công ty có 100 người đi chăng nữa.
Sau khi triển khai tối ưu hóa thì sử dụng key như sau: videoId + userIp
là key, điều này có thể ngăn chặn hiệu quả hơn nữa các cú nhấp chuột. Đến đây bạn lưu ý cho tôi điều này, đó là việc lấy ip của user thông qua getRemoteAddr()
, nhưng nếu user dùng phần mềm proxy reverse thì bạn có thể lấy X-FORWARDED-FOR
thông qua header của user hay request.getHeader("x-forwarded-for")
để lấy ip thật. Ngoài ra mấy anh hack youtube giả lập ip gì đó thì tôi không biết. Để cho mấy anh làm ăn, chứ bóc ra thì số tôi hơi mệt. Đến đây thì anh em cũng đã hiểu rồi cho nên tôi xin phép đi vào code luôn chứ anh em lại nói là để con giữa chợ.
Triển khai code redis và nodejs tính lượt views
Xem VIDEO CODE cho rõ, không cần đọc code. Xem ở đâu, kéo lên trên kia hoặc click vào đây.
Thân ái và quyết thắng.