Asked Sep 11th, 4:38 PM 60 1 3
  • 60 1 3
+1

Visit statistics using Redis

Share
  • 60 1 3

Chào cộng đồng viblo, mình có vấn đề với redis mong được mọi người giúp đỡ. Hiện tại mình đang sử dụng php, mysql để thống kê truy cập cho website của mình. Nhưng hiện do mysql ko thể đáp ứng được lượt truy cập cao nên thường bị thiếu thống kê nên mình chuyển sang redis, nhưng mình chưa có kinh nghiệm với redis nên mong mọi người giúp đỡ. Bài toán của mình như sau: thống kê số lượt view của một post theo ngày và tổng lượt view theo thời gian. Mỗi post sẽ thuộc một hoặc nhiều chuyên mục => Cần thống kê lượt truy cập từng chuyên mục theo từng ngày và tổng. Cuổi ngày mình cần reset data day count về 0. Do mình chuyển sang redis nên mình cũng cần đồng bộ data ngược lại mysql sau một khoảng thời gian nhất định. Hiện tại mysql của mình có 2 bảng như sau

Hiện tại mình đang sử dụng merge để tăng day_count. Vì vậy nên khi có lượng truy cập cao day_count sẽ không đúng (mình không sử dụng mỗi request một row vì số site của mình traffic khá lớn nên database sẽ to rất nhanh). Vậy với bài toán như trên redis tổ chức như thế nào cho hợp lý nhất? Cách đơn giản nhất là sử dụng key dạng post_statistics:pid:day_count, post_statistics:pid:total_count, category_statistics:date:cid:day_count. Với kiểu này mình có thể implement dễ dàng sử dụng INCR để tăng counter. Và về bộ nhớ như bài này có đề cập thì 1 triệu bản key cần 70 Mb, mình có khoảng 1 triêu * 2 (day_count, total) + 5 năm * 365 ngày * 100 (category) => khoảng 200 Mb. Nhưng liệu với bài toán như vậy thì có cách nào lưu trữ tối ưu hơn ví dụ như Hashes? Mong mọi người có kinh nghiệm giúp đỡ mình.

Sep 11th, 6:19 PM

Cho mình hỏi ngu chút, day_count dùng để làm gì vậy ạ?

0
| Reply
Share

3 ANSWERS


Answered Sep 11th, 4:49 PM
+1

Ngoài kia nếu có khó khăn quá về nhà anh nhé, có em chờ!

Đó là lời bài hát Có em chờ - của Min thôi. Mình thì không có comment gì về cách giải quyết vấn đề của bạn. Mình chỉ thấy nếu khó khăn quá thì mình dùng một cái service của bên thứ 3 để thống kê đi. Chẳng hạn như Google Analytics chẳng hạn. https://developers.google.com/analytics/devguides/reporting/core/v4/ Cứ cuối mỗi ngày request đến API của GA lấy giá trị pageview theo daterange bạn mong muốn.

Share
Answered Sep 12th, 1:44 AM
0

Không thể xác định cách lưu trữ tối ưu nếu chỉ phụ thuộc vào lượng dữ liệu cần lưu trữ của bạn. Việc dùng no-sql như hash, b-tree, b+ tree hay bitmap,... còn phụ thuộc vào tần suất truy vấn (xuất/ nhập/ xóa) và loại truy vấn (sparce, dense, clustering, non-clustering) mà bạn thường sử dụng. Đây là một tài liệu bạn có thể tham khảo: https://drive.google.com/file/d/0B8a305L6HNbwcmhCd3NVMDB6cnc/view?usp=sharing

Share
Answered Sep 12th, 7:06 AM
0

VIệc đếm người dùng truy cập không bị miss mình có recommend:

Phương pháp tạo ID thống nhất dựa vào time stamp của snowflake (Twitter) để không bị miss từng lượt truy cập, sau đó sử dụng con số này để updated day_count.

Share