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])
}
Такой подход позволяет в реальном времени накапливать уникальные просмотры и получать статистику за любой день. При необходимости можно добавить периодическую очистку старых данных, чтобы не накапливать память.