Em muốn hỏi thêm là bth những hệ thống count như này (stackaks) thì sẽ implement bằng cách nào ạ, chủ yếu là scale và tránh race condition.
Em cảm ơn ạ.
Em muốn hỏi thêm là bth những hệ thống count như này (stackaks) thì sẽ implement bằng cách nào ạ, chủ yếu là scale và tránh race condition.
Em cảm ơn ạ.
Như vậy thì redis đã cài đặt 1 cấu trúc dữ liệu cho HyperLogLog để chuyên cho mục đích counting, và ưu điểm của nó là chỉ tốn tối đa 12KB bộ nhớ thôi. Ví dụ nếu như bình thường muốn count số lượng vote của 1 bài viết em sẽ cần map thế này: bài viết 1: setOf(user1, user2, user3)
để cho ra count = 3, tuy nhiên khi em có hàng triệu user thì set kia nó sẽ lớn và em sẽ cần tốn hàng MB cho mỗi lần query, sẽ dễ gây out of memory. Tuy nhiên với HyperLogLog thì dù thế nào nó cũng chỉ tốn tối đa 12KB mà thôi.
Tại sao không dùng incr?
Bây giờ nếu em phải dùng incr thì em sẽ phải lưu thế nào?
bài viết 1 | user1 | count = 1 bài viết 1 | user2 | count = 1
Hay
user1 | bài viết 1 | count = 1 user2 | bài viết 1 | count = 1
Hay
bài viết 1 | count = 123 bài viết 2 | count = 456
Cả 3 cách đều không được, riêng cách 3 thì có thể được, nhưng em sẽ phải sinh ra 1 con server riêng biệt (để tránh race) để kiểm tra thằng user nó đã vote chưa rồi mới incr lên được.
Vậy nếu có 1 phương án gần đúng và nhẹ nhàng và sử dụng được trong môi trường nhiều server như HyperLogLog sẽ là giải pháp tốt hơn.
Còn về stackask thì sao?
Đối với những trang như stackask khi cơ sở dữ liệu còn bé (dưới vài triệu bản ghi) thì để cho đơn giản vẫn query từ MySQL thôi em ạ.
Em có thắc mắc đoạn "riêng cách 3 thì có thể được, nhưng em sẽ phải sinh ra 1 con server riêng biệt (để tránh race) để kiểm tra thằng user nó đã vote chưa rồi mới incr lên được."
Em chưa hiểu lắm tại sao phải dùng 1 con server riêng ạ.
Ý em là mình có thể lưu đúng như a nói: post1|count = 123, mỗi lần có user view thì mình lại inc count lên post1|count = 124. Em nghĩ cái này quan trọng là lúc tăng phải tránh race vì 2 user có thể vào cùng 1 lúc,nhưng mà may là redit có single thread nên có support chỗ này : https://redis.io/commands/incr/. Một vấn đề nữa là với traffic lớn thì mình incr +1 liên tục vào 1 key như vậy thì redis có handle được không ạ.