Популярные сегодня, на этой неделе, в этом месяце - шаблон проектирования

У меня есть система, которая отображает записи, упорядоченные по одному из трех полей: самые популярные сегодня, на этой неделе и в этом месяце. Каждый раз, когда просматривается запись, счет увеличивается на 1, изменяя порядок.

Поэтому, если запись 1 является новой и просмотрена сегодня 10 раз, ее оценки будут следующими:

Today: 10
Week: 10
Month: 10

Текущее решение

На данный момент у меня просто есть 3 поля, связанные с каждой записью, одно на сегодня, другое на этой неделе и другое на этот месяц. Каждый раз при просмотре записи все три балла увеличиваются на 1.

В конце дня счет за день сбрасывается на 0. В конце текущей недели счет за неделю устанавливается на 0, а в конце текущего календарного месяца счет за месяц устанавливается на 0.

Эта проблема

Хотя это работает и занимает мало места, это не идеально по двум причинам:

1) В конце текущего периода (день, неделя, месяц) это значение сбрасывается в 0 сразу, что означает, что в 00:00:00 каждый день рейтинг сбрасывается, а все дневные оценки равны 0, То же самое верно для конца недели и конца месяца. В 00:00:00 1-го числа каждого месяца все оценки устанавливаются в 0, теряя все существующие данные рейтинга.

2) Поскольку конец месяца обычно приходится на неделю (пн-вс), месячные баллы сбрасываются в течение недели, что приводит к тому, что еженедельные баллы превышают месячные.

Возможное решение

Я мог бы использовать скользящий почасовой счетчик для каждого часа месяца, который используется для вычисления баллов за текущий день, неделю, месяц на основе индекса текущего часа.

Array size = 31 * 24 = 744 int16 values

Таким образом, 1-го в 4 часа ночи представление будет размещено в часах [4]

hours[4]++

Затем калькулятор статистики будет использовать сегодня в качестве суммы последних 24 значений, а оценка на этой неделе будет суммой последних (24 * 7) значений. Наконец, этот месяц будет суммой последних (24 * 31) значений.

Решение проблем

Основная проблема с решением 1 - требования к диску / памяти. Я'мы перешли от использования 32-битных значений в моем текущем решении к использованию 32-битных значений 744. Даже если я изменю их на in16, яЯ все еще буду использовать намного больше памяти на запись

Memory per Entry = 3 * 4 bytes = 12 bytes (Existing)
Memory per Entry = 744 * 2 = 1,488 bytes (possible solution)

С этим решением мое использование памяти на запись подскочило на 12400% !!

Может ли кто-нибудь предложить другое решение, которое будет соответствовать решению проблем в моем текущем решении, но без использования 1,5 КБ на запись?

Большое спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос