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.