2017-03-22 2 views
1

Ich habe eine Idee Ansicht zählt für Beiträge auf meiner Website zu speichern, aber Probleme habe, die Methoden zu verwenden und wie sie zu gestalten. Meine Nutzer hinterlassen viele kleine Beiträge, so gibt es viele einzigartige Beiträge werdenShop Ansichten mit redis

Meine Anforderungen sind die folgenden:

  • Die Beiträge in einer Mysql Cloud-Datenbank gespeichert werden. Ich werde regelmäßig Daten von Redis ziehen müssen, um Mysql mit den Ansichten zu aktualisieren.

  • ich nicht mit EXACT Genauigkeit besorgt bin, kann die Ansichten zeigen ein bisschen weniger sein (~ 10% weniger als die tatsächlichen tolerierbar ist).

  • In Bezug auf die Richtigkeit der Ansichten müssen in Echtzeit nicht sein. Für neue Beiträge würde Ich mag sie alle 30 Minuten aktualisiert werden, für ältere Beiträge (älter als eine Woche) ich die Ansichten einmal täglich aktualisieren.

  • Idealerweise würde jede Ansicht eindeutig sein (basierend auf Benutzer) und so würde jede Ansicht zählen wie die Benutzer die Post einmal gesehen hat. Ein Benutzer konnte einen Beitrag nicht mehr als einmal ansehen. Das wäre ideal, aber ich würde für die gesamte Lebensdauer der Anwendung jeden Benutzer macht jede einzelne Ansicht speichern muß und immer überprüfen, ob der Benutzer bereits diesen Beitrag gesehen hat, und das ist einfach nicht machbar. Also, was ich möchte sind die Ansichten müssen für einen Benutzer für eine begrenzte Zeit einzigartig sein. Wenn also ein neuer Beitrag herauskommt und Bob ihn ansieht, zählt das als 1 Ansicht. Wenn er es nach 10 Minuten wieder ansieht, ist die Zählung immer noch wie zuvor 1. Wenn Bob es in 1 Stunde erneut ansieht, würde dies als eine neue Ansicht zählen. Wenn der Beitrag älter als eine Woche war, sollten Bobs Ansichten nur dann zählen, wenn er mehr als einmal am Tag ansieht.

Die Strömungs Pseudo-Code:

//Page view comes to server, lets add the unique postId. 

//Using SADD because it will not insert a key that already exists. Not sure of the difference between sadd and pfadd? 
sadd "post:tracking", @post.id 

//Add the unique user who viewed this page 
sadd "post:#{@post.id}:uniques", @userId 

I dann einen cronjob laufen, die folgendes tun:

//Run this every 30 minutes 
loop through smembers(post:tracking).For each post do{ 
     //Get number of views for this post: 
     var cnt = SCARD("post:@postId:uniques") 
     //post to database new count 
} 

alle 30 Minuten, es wird eine Schleife durch alle Sätze (posts) und Erhalte die Kardinalität (Anzahl) der Mitglieder in diesem Set und aktualisiere die Mysql-Datenbank. Es gibt ein Problem hier und das ist, ich unterscheide nicht zwischen neuen Posts (nicht älter als 1 Woche) und älteren Posts (älter als 1 Woche). In meinem Beispiel ist die Zeit, zu der die Posts erstellt wurden, nicht enthalten, da ich nicht sicher bin, wo diese Informationen gespeichert werden sollen, und darum suche ich Hilfe. Ich versuche, das effizienter zu machen.

Antwort

1

Haben Sie sich hyperloglogs? angesehen. Sie speichern einzigartige Dinge (Betrachter) sehr effizient, mit ziemlich guter Genauigkeit (etwa 1%). Du könntest sie laufen lassen und jede Stunde/Tag/Woche Statistiken von ihnen ziehen, um insgesamt Zuschauerzahlen zu erhalten.