Trước hết, "tỷ lệ truy cập mỗi phút" được tính:
[hits during period]/[length of period]
Vì vậy, tỷ lệ sẽ thay đổi tùy theo thời gian là bao lâu. (Phút cuối cùng? 10 phút cuối cùng? Kể từ khi số lần truy cập bắt đầu được ghi lại? Vì thẻ bắt đầu bằng # được sử dụng?)
Vì vậy, những gì bạn thực sự muốn lưu là số lần truy cập chứ không phải tỷ lệ. Nó là tốt hơn để một trong hai:
- Store hashtags và đếm hit của họ trong một thời gian nhất định (ít bộ nhớ/CPU cần thiết nhưng ít linh hoạt)
- HOẶC dấu thời gian và hashtag của mỗi hit (nhiều bộ nhớ/cpu bắt buộc nhưng linh hoạt hơn)
Bây giờ, việc chọn khoảng thời gian quan tâm và truy vấn cơ sở dữ liệu để tìm 10 thẻ bắt đầu bằng # có nhiều lần truy cập nhất trong khoảng thời gian đó.
Nếu bạn cần hiển thị tỷ lệ, hãy sử dụng công thức ở trên, nhưng lưu ý rằng nó không thay đổi thứ tự của thẻ bắt đầu bằng # vì khoảng thời gian này giống nhau cho mỗi thẻ bắt đầu bằng #.
Bạn có thể áp dụng thuật toán ở trên cho hầu hết mọi DB. Bạn thậm chí có thể làm điều đó mà không cần sử dụng một cơ sở dữ liệu (chỉ cần sử dụng một hashmap được xây dựng của ngôn ngữ lập trình).
Nếu hiệu suất là mối quan tâm và sẽ có nhiều thẻ bắt đầu bằng # khác nhau, tôi khuyên bạn nên sử dụng OLAP database. Cơ sở dữ liệu OLAP được thiết kế đặc biệt cho các truy vấn đầu k (trong một khoảng thời gian nhất định) như thế này.
Có nói rằng, đây là ví dụ về cách hoàn thành trường hợp sử dụng của bạn trong Solr: Solr as an Analytics Platform.Solr không phải là một cơ sở dữ liệu OLAP, nhưng ví dụ này sử dụng Solr như một OLAP DB và có vẻ là dễ dàng nhất để thực hiện và thích ứng với trường hợp sử dụng của bạn:
schema Solr của bạn sẽ trông giống như:
<fields>
<field name="hashtag" type="string"/>
<field name="hit_date" type="date"/>
</fields>
Một tài liệu ví dụ sẽ là:
{
"hashtag": "java",
"hit_date": '2012-12-04T10:30:45Z'
}
Một truy vấn mà bạn có thể sử dụng sẽ là:
http://localhost:8983/solr/select?q=*:*&facet=true&facet.field=hashtag&facet.mincount=1&facet.limit=10&facet.range=hit_date&facet.range.end=2013-01-01T00:00:00Z&facet.range.start=2012-01-01T00:00:00
Cuối cùng, sau đây là một số tài nguyên tiên tiến liên quan đến câu hỏi này:
tôi nghĩ rằng HammerDB có thể làm. – ihemant360