2014-01-30 4 views
5

Reddit hat verschiedene Eimer für Top-Beiträge. Sie haben "Diese Stunde", "Heute", "Diese Woche", "Diesen Monat", "Dieses Jahr", "Alle Zeiten". Der beste Weg, um diese Listen zu erstellen, wäre, jede Abstimmung mit einem Zeitstempel zu speichern, so dass Sie die Punktzahl eines Beitrags für jeden Bucket berechnen können. Dies wäre eine teure Abfrage, aber sie könnten damit durchkommen, da Top für alle Benutzer gleich ist und sich nicht sehr ändert, so dass sie die Abfrageergebnisse zwischenspeichern können.Wie verfolgt Reddit Top-Beiträge

Das ist nur meine beste Vermutung, aber ich bin neugierig, macht Reddit das wirklich oder gibt es einen besseren Weg?

Antwort

5

Erstens, "diese Stunde", "heute", "diese Woche" usw. beziehen sich alle auf den Zeitpunkt der Einreichung (Link/Kommentar) und nicht auf die Abstimmungen. Ich konzentriere mich hier auf Links, aber Kommentare werden in ähnlicher Weise für die Anzeige auf Benutzerseiten verarbeitet.

Kurze Antwort: Eine Reihe von Cron-Jobs ziehen den relevanten Zeitraum, sortieren die Links und gruppieren sie nach subreddit, dann speichern Sie zwischengespeicherte Listen von Links für eine schnelle Durchsicht.

Um zu erarbeiten, gibt es für jeden Zeitraum einen anderen Cron-Job. Der Job "top this hour" läuft viel häufiger als der Job "top this hour". Das erste, was jeder Job macht, ist eine Liste aller Links aus der Datenbank, die in dem interessierenden Zeitraum erstellt wurden. Dies wird in eine Textdatei ausgegeben, in der ein primitives Map-Reduction-System die Daten verarbeitet. Die Links sind gruppiert und sortiert. Die endgültige Liste der Ergebnisse wird dann in Cassandra als eine einfache Liste von Link-IDs eingegeben, die sehr schnell in der Anfrage nachschlagen.

Quelle: https://github.com/reddit/reddit/blob/master/scripts/compute_time_listings

FWIW, einzelne Stimmen tun haben Zeitstempel an ihnen, aber sie sind für die Verfolgung von Top nicht direkt verwendet.