Sobes.tech
Senior

/* Ste spisovateľ, spravujete svoj mini blog a tam publikujete články. Používatelia (čitatelia) vášho blogu, po prihlásení, ich môžu prezerať/čítať. Je potrebné implementovať funkciu na počítanie unikátnych zobrazení za deň pre každý článok. Funkčné požiadavky: - Štatistika za dnešok: Autor môže vidieť, koľko unikátnych používateľov si jeho článok dnes pozrelo (údaje sa zbierajú v reálnom čase). - Štatistika za minulé dni: Autor môže vidieť štatistiku za ktorýkoľvek minulý deň (napríklad včera). Technické obmedzenia a podmienky: - Aplikácia beží na jednom serveri (jeden pod) - Ukladanie v pamäti - Čas v UTC0 */

sobes.tech AI

Odpoveď od AI

Для подсчёта уникальных просмотров статей за день с хранением данных в памяти и одним сервером можно использовать следующую структуру:

  • Для каждого дня (по дате UTC) хранить мапу: map[articleID]map[userID]bool, где ключи — ID статьи и ID пользователя.
  • При просмотре статьи авторизованным пользователем добавлять userID в мапу для соответствующей статьи и текущей даты.
  • Для получения статистики за сегодня или прошедший день считать длину внутренней мапы пользователей для статьи.

Пример на Go:

type Stats struct {
    mu sync.RWMutex
    data map[string]map[string]map[string]bool // date -> articleID -> userID -> bool
}

func NewStats() *Stats {
    return &Stats{data: make(map[string]map[string]map[string]bool)}
}

func (s *Stats) AddView(articleID, userID string) {
    s.mu.Lock()
    defer s.mu.Unlock()
    date := time.Now().UTC().Format("2006-01-02")
    if s.data[date] == nil {
        s.data[date] = make(map[string]map[string]bool)
    }
    if s.data[date][articleID] == nil {
        s.data[date][articleID] = make(map[string]bool)
    }
    s.data[date][articleID][userID] = true
}

func (s *Stats) GetUniqueViews(articleID, date string) int {
    s.mu.RLock()
    defer s.mu.RUnlock()
    if s.data[date] == nil || s.data[date][articleID] == nil {
        return 0
    }
    return len(s.data[date][articleID])
}

Такой подход позволяет в реальном времени накапливать уникальные просмотры и получать статистику за любой день. При необходимости можно добавить периодическую очистку старых данных, чтобы не накапливать память.