Sobes.tech
Senior

/* Сиз жазуучусуз, өзүңүздүн мини блогуңузду башкарасыз жана анда макалалар жарыялайсыз. Блогуңуздун колдонуучулары (окурмандар), киргенден кийин, аларды көрө жана окуй алышат. Ар бир макала үчүн күндүк уникалдуу көрүүлөрдүн санын эсептөө функциясын ишке ашыруу керек. Функционалдык талаптар: - Бүгүнкү статистика: Автор, бүгүн анын макаласын канча уникалдуу колдонуучу көргөнүн көрө алат (маалыматтар реал убакытта чогултулат). - Өткөн күндөрдүн статистикасы: Автор, каалаган өткөн күндүн статистикасын көрө алат (мисалы, кечээ). Техникалык чектөөлөр жана шарттар: - Колдонмо бир серверде иштейт (бир под) - Эстутемеде сактоо - Время UTC0 */

sobes.tech AI

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])
}

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