|
|
#1 (permalink) |
|
Erfahrener Benutzer
|
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 |
|
|
|
| Gesponsorte Links |
|
|
#2 (permalink) | |
|
-
|
Zitat:
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. |
|
|
|
|
|
|
#3 (permalink) | |
|
Erfahrener Benutzer
|
Zitat:
Hätte nicht gedacht, dass MySQL soviele Datensätze schnell bearbeiten kann. Aufjedenfall erstmal Danke für die Hilfe. |
|
|
|
|
|
#5 (permalink) |
|
Erfahrener Benutzer
|
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. |
|
|
|
|
#6 (permalink) |
|
-
|
Wenn ich das richtig verstehe hast du dann folgende Felder:
UserID, SiteIDs, Timestamp Damit würdest du dann aber gegen die 1. Normalform verstossen. |
|
|
|
|
|
#7 (permalink) |
|
Erfahrener Benutzer
|
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... |
|
|
|
|
|
#8 (permalink) | ||||
|
Multitalent
|
Zitat:
500 Seiten * (4stellige Seiten-Id (bissel Luft sollte schon sein) + 10-stelliger Timestamp + 2 Trennzeichen) = 8000 Zeichen. Zitat:
Zitat:
Zitat:
|
||||
|
|
|
|
|
#9 (permalink) | ||
|
Erfahrener Benutzer
|
Zitat:
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:
Geändert von xdragonx (22.08.2011 um 21:03:11 Uhr) |
||
|
|
|
|
#10 (permalink) |
|
Multitalent
|
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. |
|
|
|
|
|
#11 (permalink) | |
|
Erfahrener Benutzer
|
Zitat:
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 Geändert von xdragonx (22.08.2011 um 22:25:30 Uhr) |
|
|
|
|
|
#12 (permalink) |
|
www.Scar4U.de
|
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.
:: BackTix - Backlinks kaufen und Backlinks verkaufen
:: Online Formular Manager & Formular Generator :: kostenloser Webkatalog ohne Backlink Geändert von Scar (27.08.2011 um 12:27:40 Uhr) |
|
|
|
|
|
#13 (permalink) | |
|
bekämpft die Mächte des Bösen
|
Zitat:
|
|
|
|
|
|
|
#14 (permalink) | |
|
www.Scar4U.de
|
Zitat:
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. |
|
|
|
|
![]() |
| Gesponsorte Links |
| Anzeige |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| Ansicht | |
|
|
Ä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 |