Alt 22.08.2011, 18:35:55   #1 (permalink)
Erfahrener Benutzer

ID: 310927
Lose-Remote

Reg: 04.03.2008
Beiträge: 325
xdragonx wird schon bald berühmt werden
Standard Reloadsperre

Hi,

Sitze zurzeit an einer Erweiterung, welche mit Reloadsperren arbeiten soll.

In dem Fall beträgt sie 24h. Jetzt die Frage, wie ich das lösen kann, ohne dass viele Resourcen verschwendet werden.

Nehmen wir mal an es sind 500 Seiten zum Klicken da und 10.000 User sind angemeldet die alle aktiv klicken. Dann muss für jeden Klick ein Timestamp angelegt werden und immer überprüft werden, wann dieser abläuft.

Sind also wenn alle User an einem Tag alle 500 Seiten klicken, 5 Mio. Datensätze. Das sind eindeutig zuviele. Mir fällt aber gerade kein anderer Lösungsweg ein.

Loseseiten kriegen dies ja auch hin, wenn nicht mit ganz sovielen Usern aber mehreren Seiten zum Klicken. Cookies ist auch keine gute Idee, da diese manipulierbar sind. Die Suchfunktion hat leider nichts ergeben.

Gruss xdragonx

Freuen uns über jedes Feedback!
xdragonx ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 22.08.2011, 18:45:02   #2 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Zitat:
Zitat von xdragonx Beitrag anzeigen
Sind also wenn alle User an einem Tag alle 500 Seiten klicken, 5 Mio. Datensätze. Das sind eindeutig zuviele.
Was stört dich daran? Datenbanken sind für solche Probleme ausgelegt.
Wenn du noch die Indexe richtig setzt wirst du auch keine Performance-Probleme bekommen.

Eine Andere nicht manipulierbare Lösung wäre mir nicht bekannt.
Xot ist offline   Mit Zitat antworten
Alt 22.08.2011, 18:59:51   #3 (permalink)
Erfahrener Benutzer

ID: 310927
Lose-Remote

Reg: 04.03.2008
Beiträge: 325
xdragonx wird schon bald berühmt werden
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
Was stört dich daran? Datenbanken sind für solche Probleme ausgelegt.
Wenn du noch die Indexe richtig setzt wirst du auch keine Performance-Probleme bekommen.

Eine Andere nicht manipulierbare Lösung wäre mir nicht bekannt.
Hab gerade eine andere Möglichkeit gefunden, aber werde beide Möglichkeiten auf ihre Performance testen.

Hätte nicht gedacht, dass MySQL soviele Datensätze schnell bearbeiten kann.

Aufjedenfall erstmal Danke für die Hilfe.

Freuen uns über jedes Feedback!
xdragonx ist offline Threadstarter   Mit Zitat antworten
Alt 22.08.2011, 19:05:16   #4 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Zitat:
Zitat von xdragonx Beitrag anzeigen
Hab gerade eine andere Möglichkeit gefunden
Die wäre?
Xot ist offline   Mit Zitat antworten
Alt 22.08.2011, 19:11:17   #5 (permalink)
Erfahrener Benutzer

ID: 310927
Lose-Remote

Reg: 04.03.2008
Beiträge: 325
xdragonx wird schon bald berühmt werden
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
Die wäre?
Jeder User sprich jeder Datensatz hat ein Feld, wo die ID's der geklickten Links inkl. Timestamp eingefügt werden.

Wenn der User nun die Linkliste aufruft oder einen Link anklickt, wird überprüft, ob der erste Eintrag im Feld abgelaufen ist, und gelöscht. Dies geschieht solange, bis ein Eintrag gefunden wurde, der noch nicht abgelaufen ist.

Somit hat man nur einen Datensatz pro User. Wie schnell dies abgearbeitet wird, werde ich testen.

Freuen uns über jedes Feedback!
xdragonx ist offline Threadstarter   Mit Zitat antworten
Alt 22.08.2011, 20:17:19   #6 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Wenn ich das richtig verstehe hast du dann folgende Felder:
UserID, SiteIDs, Timestamp

Damit würdest du dann aber gegen die 1. Normalform verstossen.
Xot ist offline   Mit Zitat antworten
Alt 22.08.2011, 20:19:12   #7 (permalink)
Erfahrener Benutzer

ID: 141382
Lose-Remote

Reg: 20.05.2006
Beiträge: 414
TerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz seinTerraTux kann auf vieles stolz sein
Standard

Solche Schleifen (und das wirds im Endeffekt werden) in PHP dauern erfahrungsgemäß immer länger, als wenn eine gut gestrickte SQL-Query 5Mio Datensätze durchforstet.

Und der Performance wird es auch keinen abbrechen, da die 5 Mio Datensätze auch nicht binnen 3sek generiert werden.

Außerdem willst Du ja nur die Links anzeigen die nicht im reload sind. Wenn ich Deinen Plan richtig verstehe, willst Du alle Links abrufen, und für jeden Link beim aktuellen User prüfen ob reload oder nicht.

Mach so wie Xot vorgeschlagen hat. Also extra Tabelle mit userid, linkid und aktueller Timestamp + 86400sek.

Sinngemäß:
=> DELETE FROM sperrliste WHERE timestamp < time()-86400 (kann man auch 5minütlich per CRON laufen lassen, dann ist's aus dem Script raus)

=> SELECT linkid WHERE userid = $userid -> in ein array $reload
=> SELECT * FROM links WHERE linkid NOT IN (implode(',', $reload))

Die Queries sind jetzt nur "dahingeklatscht" ohne Rücksicht auf Syntax, und lassen sich auch eleganter gestalten. Aber MySQL kriegt das hin...
We have joy we have fun we have UNIX on a SUN
[Mein Link] [Geschlechterkampf - Vote für die Männer]
TerraTux ist offline   Mit Zitat antworten
Alt 22.08.2011, 20:52:55   #8 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Zitat:
Zitat von xdragonx Beitrag anzeigen
Jeder User sprich jeder Datensatz hat ein Feld, wo die ID's der geklickten Links inkl. Timestamp eingefügt werden.
Also hätte dieses Feld eine maximale Länge von
500 Seiten * (4stellige Seiten-Id (bissel Luft sollte schon sein) + 10-stelliger Timestamp + 2 Trennzeichen) = 8000 Zeichen.

Zitat:
Wenn der User nun die Linkliste aufruft oder einen Link anklickt, wird überprüft, ob der erste Eintrag im Feld abgelaufen ist, und gelöscht. Dies geschieht solange, bis ein Eintrag gefunden wurde, der noch nicht abgelaufen ist.
Und wer soll das machen? MySQL? PHP? Für MySQL siehts da wohl schlecht aus und bei PHP müsstest du letztlich auch den kompletten Inhalt analysieren, da ja theoretisch auch ein Aufruf einer ID stattfinden könnte, die irgendwo in der Mitte oder am Ende des Strings steht. Also alles schön mit explode trennen und hinterher wieder zusammenflicken.

Zitat:
Somit hat man nur einen Datensatz pro User.
Einen sehr langen, unhandlichen und nicht normalisierten.

Zitat:
Wie schnell dies abgearbeitet wird, werde ich testen.
Ich tippe auf die Tabelle mit den vielen Datensätzen.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 22.08.2011, 20:54:03   #9 (permalink)
Erfahrener Benutzer

ID: 310927
Lose-Remote

Reg: 04.03.2008
Beiträge: 325
xdragonx wird schon bald berühmt werden
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
Wenn ich das richtig verstehe hast du dann folgende Felder:
UserID, SiteIDs, Timestamp

Damit würdest du dann aber gegen die 1. Normalform verstossen.
Sind nur 2 Felder.

UserID und SiteID - Timestamp

SiteID und Timestamp sind durch einen Bindestrich getrennt und befinden sich in einem Feld. Per Komma, kommen weitere SIteID's+Timestamps hintendran. Diese werden per Explode aufgeteilt und dann überprüft.

Wielange dauert es denn bei einem halbwegs guten vServer mit 2GB Ram garantiert, um alle abgelaufenen Klicks aus einer Tabelle mit 5 Mio. Datensätzen zu löschen?

Zitat:
Zitat von joschilein Beitrag anzeigen
Und wer soll das machen? MySQL? PHP? Für MySQL siehts da wohl schlecht aus und bei PHP müsstest du letztlich auch den kompletten Inhalt analysieren, da ja theoretisch auch ein Aufruf einer ID stattfinden könnte, die irgendwo in der Mitte oder am Ende des Strings steht. Also alles schön mit explode trennen und hinterher wieder zusammenflicken.
Die ID's der geklickten Seiten in dem Feld sind geordnet. Heißt, dass die erste ID aufjedenfall als erstes gelöscht werden muss. Also das FIFO - Prinzip

Freuen uns über jedes Feedback!

Geändert von xdragonx (22.08.2011 um 21:03:11 Uhr)
xdragonx ist offline Threadstarter   Mit Zitat antworten
Alt 22.08.2011, 21:22:16   #10 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Das mag ja sein. Aber du musst doch zwischendurch auch verweigern können, wenn eine ID noch in der Reloadsperre ist, obwohl du gar nicht damit rechnest, dass sie gerade aufgerufen wird.

Ich weiß ja nicht wie dein System aufgebaut ist. Vermutlich ist es aber irgendwie möglich GET oder POST Parameter zu manipulieren und damit eine ID aufzurufen, die eigentlich gar nicht in der Liste der aktuell verfügbaren IDs angezeigt war.

Und spätestens wenn du die Liste der verfügbaren IDs darstellen möchtest, musst ja den kompletten Datensatz auslesen, um die ausgeschlossenen IDs zu kennen.

Und das wäre datenbankintern ohne Stringmanipulation leicht möglich. Wenn du eine Tabelle links (id, url, titel, ..) hast und eine Tabelle reloadsperre (linkid, userid, datetime), könntest du einfach in einer einzigen Abfrage einen LEFT JOIN auf links machen, per userid verknüpfen und nach zeitpunkt aussortieren. Dürfte grob geschätzt deutlich schneller sein als irgendwelche Stringmanipulationen.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 22.08.2011, 21:34:46   #11 (permalink)
Erfahrener Benutzer

ID: 310927
Lose-Remote

Reg: 04.03.2008
Beiträge: 325
xdragonx wird schon bald berühmt werden
Standard

Zitat:
Zitat von joschilein Beitrag anzeigen
Ich weiß ja nicht wie dein System aufgebaut ist. Vermutlich ist es aber irgendwie möglich GET oder POST Parameter zu manipulieren und damit eine ID aufzurufen, die eigentlich gar nicht in der Liste der aktuell verfügbaren IDs angezeigt war.
Manipulierbar ist nichts, da ja überprüft wird, ob die Seite noch in der Reloadsperre ist oder nicht. Und falls nicht, ist sie gar nicht mehr in der Liste.

Werden gleich ein paar Tests gestartet um zu sehen, was im Endeffekt schneller arbeitet. Melde mich später nochmal.

Recht hast du schon mit den Stringmanipulationen. Die Tests werden es zeigen.

E: Okay war eindeutig. Ich befolge euern Rat

Freuen uns über jedes Feedback!

Geändert von xdragonx (22.08.2011 um 22:25:30 Uhr)
xdragonx ist offline Threadstarter   Mit Zitat antworten
Alt 27.08.2011, 12:06:36   #12 (permalink)
www.Scar4U.de

ID: 81662
Lose-Remote
Reallife

Reg: 03.06.2006
Beiträge: 427
Scar wird schon bald berühmt werden
Standard

Wenn du die Wahl hast, dann nutze InnoDB.
Damit kannst du weit besser einstellen, wieviel Speicher die Tabellen im RAM nutzen dürfen. In dieser Folge kannst du die DB deutlich besser optimieren.

Dann noch ein-zwei kleine Tipps:
- nimm drei Spalten (wurde schon mehrfach genannt), Integer/Datetime sind immer schneller als Varchar/Text.
- prüfe lediglich ob die Kombination UserID + SiteID bereits in der Tabelle vorhanden ist (mehr nicht!)
- Nutze den Timestamp um per Cron-Job alle veraltete Datensätze zu löschen (nur dieser Prozess ist kritisch!)
- Lege einen Index auf UserID+SiteID
- Lass die Tabelle hin und wieder optimieren.

Füge den Datensatz ein. Gelingt das, führst du deine eigene Programmlogik weiter. Gelingt das nicht (schon vorhanden), brichst du ab.
Wenn du es in dieser Form umsetzt, erreichst du die maximale Performance.

Das Problem hatte ich vor kurzen ebenfalls in einer etwas komplexeren Form gelöst.

Optional kannst du in deinem Fall zusätzlich mit Cookies arbeiten. Wird ein Cookie mitgeliefert, kannst du die weiteren Prüfungen direkt umgehen. Aber Achtung, Cookies haben Größenbeschränkungen.

Geändert von Scar (27.08.2011 um 12:27:40 Uhr)
Scar ist offline   Mit Zitat antworten
Alt 27.08.2011, 12:19:32   #13 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von Scar Beitrag anzeigen
Optional kannst du in deinem Fall zusätzlich mit Cookies arbeiten. Wird ein Cookie mitgeliefert, kannst du die weiteren Prüfungen direkt umgehen. Aber Achtung, Cookies haben Größenbeschränkungen.
... und Cookies sind Userdaten, d.h. auf die is eh kein Verlass und ergo kannst du sie für diesen Zweck vergessen
theHacker ist offline   Mit Zitat antworten
Alt 27.08.2011, 12:23:17   #14 (permalink)
www.Scar4U.de

ID: 81662
Lose-Remote
Reallife

Reg: 03.06.2006
Beiträge: 427
Scar wird schon bald berühmt werden
Standard

Zitat:
Zitat von theHacker Beitrag anzeigen
... und Cookies sind Userdaten, d.h. auf die is eh kein Verlass und ergo kannst du sie für diesen Zweck vergessen
Das ist zwar richtig, in diesem Fall aber zuweit gedacht.

Damit wird nur ein User ausgeschlossen. Hat er das Cookie nicht, greift trotzdem die Datenbankprüfung.

Nicht jeder User wird diese Cookies löschen, insofern könnte man es durchaus als zusätzlich Vorfilterung nutzen.
Scar ist offline   Mit Zitat antworten
Alt 27.08.2011, 12:53:32   #15 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Und wenn Cookies nicht gelöscht sondern noch da sind, dann kann man sich auf ihre Unmanipulierbarkeit verlassen?


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[S] Reloadsperre cooltek Lose4Scripts 2 18.04.2010 15:56:39
WMS Reloadsperre Slemens Bug-Report 4 29.08.2008 12:24:29
[DB] Reloadsperre - Datenbankaufbau resoucer Programmierung 11 06.10.2007 16:35:24
[s] Linkcounter mit IP Reloadsperre Cosmo Scripts & Software 4 07.06.2007 11:07:57


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20:02 Uhr.