Senior
Siz yazıçısınız, kiçik blogunuzu idarə edirsiniz və orada məqalələr dərc edirsiniz. Blogunuzun istifadəçiləri (oxucular) daxil olduqdan sonra onları görə və oxuya bilərlər. Hər məqalə üçün unikal baxışların gündəlik sayını hesablamaq funksionallığını həyata keçirmək lazımdır. Funksional tələblər: - Bu gün üçün statistikalar: Müəllif, bu gün məqaləsini neçə unikal istifadəçinin baxdığını görə bilər (məlumatlar real vaxtda toplanır). - Keçmiş günlərin statistikası: Müəllif, istənilən keçmiş gün üçün statistikaları görə bilər (məsələn, dünən). Texniki məhdudiyyətlər və şərtlər: - Tətbiq tək bir serverdə işləyir (bir pod) - Yaddaşda saxlama - Vaxt UTC0-də
sobes.tech Süni İntellekt
AI-dan cavab
Для подсчёта уникальных просмотров статей за день с учётом требований и ограничений (один сервер, 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, такой подход будет работать эффективно. При необходимости можно добавить периодическую очистку старых данных.