Sobes.tech
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ı saymaq 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 onun məqaləsini neçə unikal istifadəçi baxıb görsün (məlumatlar real vaxtda toplanır). - Keçmiş günlərin statistikası: Müəllif, hər hansı 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 */

sobes.tech Süni İntellekt

AI-dan cavab

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

  • Для каждого дня (по дате 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])
}

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