Senior
Դուք գրող եք, կառավարում եք ձեր փոքր բլոգը և այնտեղ հրապարակում եք հոդվածներ: Ձեր բլոգի օգտվողները (կարդացողների) մուտք գործելուց հետո կարող են դրանք դիտել/կարդալ: Անհրաժեշտ է իրականացնել ֆունկցիոնալություն՝ յուրաքանչյուր հոդվածի համար օրական յուրահատուկ դիտումների հաշվարկ: Ֆունկցիոնալ պահանջներ: - Այսօրվա վիճակագրություն՝ հեղինակը կարող է տեսնել, թե այսօր քանի յուրահատուկ օգտվող է դիտել իր հոդվածը (տվյալները հավաքվում են իրական ժամանակում): - Միջանցիկ օրերի վիճակագրություն՝ հեղինակը կարող է տեսնել ցանկացած անցյալի օրի վիճակագրություն (օրինակ՝ երեկ): Տեխնիկական սահմանափակումներ և պայմաններ: - Ծրագիրը աշխատում է մեկ սերվերում (մեկ պոդ) - Հիշողության մեջ պահպանում - Ժամանակ UTC0-ում
sobes.tech AI
Պատասխան AI-ից
Для подсчёта уникальных просмотров статей за день с учётом требований и ограничений (один сервер, in-memory, время UTC0) можно реализовать следующую схему:
- Для каждого дня и каждой статьи хранить множество уникальных ID пользователей, которые просмотрели статью в этот день.
- Для текущего дня данные накапливаются в реальном времени.
- Для прошедших дней данные сохраняются в отдельной структуре (например, в мапе с ключом дата+статья).
Пример на Go:
import (
"sync"
"time"
)
// Структура для хранения просмотров
// map[date][articleID] -> set of userIDs
var (
mu sync.RWMutex
views = make(map[string]map[string]map[string]struct{})
)
func getDateUTC(t time.Time) string {
return t.UTC().Format("2006-01-02")
}
// Функция для регистрации просмотра
func RegisterView(articleID, userID string) {
date := getDateUTC(time.Now())
mu.Lock()
defer mu.Unlock()
if _, ok := views[date]; !ok {
views[date] = make(map[string]map[string]struct{})
}
if _, ok := views[date][articleID]; !ok {
views[date][articleID] = make(map[string]struct{})
}
views[date][articleID][userID] = struct{}{}
}
// Получить количество уникальных просмотров за конкретный день
func GetUniqueViews(articleID, date string) int {
mu.RLock()
defer mu.RUnlock()
if dayData, ok := views[date]; ok {
if users, ok := dayData[articleID]; ok {
return len(users)
}
}
return 0
}
Особенности:
- Используем map с вложенными map для хранения уникальных пользователей.
- Для уникальности пользователей используем множество (map[string]struct{}).
- Время по UTC, чтобы корректно группировать просмотры по дате.
- Для статистики за прошедшие дни просто обращаемся к нужной дате.
Так как приложение работает на одном сервере и in-memory, такой подход будет работать эффективно. При необходимости можно добавить периодическую очистку старых данных.