Sobes.tech
Senior

/* És um escritor, geres o teu mini blog e publicas artigos lá. Os utilizadores (leitores) do teu blog, após autenticação, podem visualizá-los/lê-los. É necessário implementar uma funcionalidade para contar visualizações únicas por dia para cada artigo. Requisitos funcionais: - Estatísticas do dia: O autor pode ver quantos utilizadores únicos visualizaram o seu artigo hoje (os dados acumulam-se em tempo real). - Estatísticas de dias passados: O autor pode ver as estatísticas de qualquer dia passado (por exemplo, ontem). Restrições técnicas e condições: - A aplicação funciona num único servidor (um pod) - Armazenamento em memória - Hora em UTC0 */

sobes.tech IA

Resposta da IA

Para contar as visualizações únicas de artigos por dia, armazenando dados na memória e com um único servidor, pode usar a seguinte estrutura:

  • Para cada dia (por data UTC), armazenar um mapa: map[articleID]map[userID]bool, onde as chaves são o ID do artigo e o ID do usuário.
  • Ao visualizar um artigo por um usuário autorizado, adicionar userID ao mapa correspondente ao artigo e à data atual.
  • Para obter estatísticas de hoje ou do dia anterior, contar o comprimento do mapa interno de usuários para o artigo.

Exemplo em Go:

type Stats struct {
    mu sync.RWMutex
    data map[string]map[string]map[string]bool // data -> ID do artigo -> ID do usuário -> 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])
}

Este método permite acumular visualizações únicas em tempo real e obter estatísticas para qualquer dia. Pode-se também implementar uma limpeza periódica de dados antigos para evitar o consumo excessivo de memória.