Tom: Abfragen nur einmal pro Sekunde aufbauen

Hello,

wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

+-------------------------------------------------------+
       |                 gesamtes Forum                        |
       |           Ergebnis zwischenspeichern                  |
       |+----------+ +----------+ +----------+     +----------+|
       ||Session 1 | |Session 2 | |Session 1 | ... |Session n ||
       ||          | |          | |          |     |          ||
       || Req 1.1  | | Req 1.1  | | Req 1.1  |     | Req 1.1  ||
       ||   Func   | | Req 1.1  | | Req 1.1  |     | Req 1.1  ||
       ||   Func   | |   Func   | |   Func   |     |   Func   ||
       || Req 1.2  | | Req 1.2  | | Req 1.2  |     | Req 1.2  ||
       ||   Func   | |   Func   | |   Func   |     |   Func   ||
       ||   Func   | |   Func   | |   Func   |     |   Func   ||
       |+----------+ +----------+ +----------+     +----------+|
       +-------------------------------------------------------+

Das Ergebnis der Abrage X in den der Funktionen in den unterschiedlichen Requests in den unterschiedlichen Sessions ändert sich nicht so häufig und soll daher nicht 100mal pro Sekunde (o.ä.) neu aufgebaut werden. Man kann aber nicht unbedingt sagen, dass es innerhalb einer Session überhaupt benötigt wird. Es also prophilaktisch für die jeweiliege Session aufzubereiten, ist daher auch nicht notwendig.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://restaurant-zur-kleinen-kapelle.de
  1. Meine Herren!

    wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

    Es geht sogar noch einfacherer und performanter, der MySQL-Cache berechnet ein Anfrage-Ergebnis nur neu, falls sich etwas an den betroffenen Tabellen geändert hat, also on-demand.

    --
    “All right, then, I'll go to hell.”
    1. Hello,

      wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

      Es geht sogar noch einfacherer und performanter, der MySQL-Cache berechnet ein Anfrage-Ergebnis nur neu, falls sich etwas an den betroffenen Tabellen geändert hat, also on-demand.

      Hei, das wäre ja super, wenn es (hoffentlich) so klappen würde ...

      Das Abfrageergebnis kommt ohnehin aus einer MySQL-Datenbank und liegt dort über mehrere Tabellen verteilt.

      Im Prinzip ist es eine zeitgesteuerte Abfrage, die mit Ausnahme der fortschreitenden Zeit immer genauso aussieht. Das Ergebnis ist freilich allermeistens ein anderes. Es reicht aber, wenn es z. B. einmal pro Sekunde oder sogar noch seltener für alle User des Forums gemeinsam neu berechnet wird.

      Wenn ich das richtig verstehe, müsste man also dafür sorgen, dass sich das Query eben z.B. nur alle drei Sekunden ändert. Allerdings ändern sich die einbezogenen Tabellen äußerst dynamisch. Die können schon jede 10mal pro Sekunde oder öfter eine Änderung erfahren.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Meine Herren!

        Hello,

        wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

        Es geht sogar noch einfacherer und performanter, der MySQL-Cache berechnet ein Anfrage-Ergebnis nur neu, falls sich etwas an den betroffenen Tabellen geändert hat, also on-demand.

        Hei, das wäre ja super, wenn es (hoffentlich) so klappen würde ...

        Das Abfrageergebnis kommt ohnehin aus einer MySQL-Datenbank und liegt dort über mehrere Tabellen verteilt.

        Im Prinzip ist es eine zeitgesteuerte Abfrage, die mit Ausnahme der fortschreitenden Zeit immer genauso aussieht. Das Ergebnis ist freilich allermeistens ein anderes.

        Hm, das könnte ein Problem sein, so gut kenn' ich den Cache auch nicht.

        Allerdings ändern sich die einbezogenen Tabellen äußerst dynamisch. Die können schon jede 10mal pro Sekunde oder öfter eine Änderung erfahren.

        Und das ist in der Tat ein Problem. Eine Änderung in einer Tabelle wirft frühere gecachte Anfragen über den Haufen. Das könnte man zum Beispiel über eine Zwischendatenbank lösen, die ständig live aktualisiert wird, aber ihre Änderungen nur alle paar Sekunden an die Hauptdatenbank überträgt. Das ist aber ein enormer Aufwand.

        Mal ganz am Rande: Hast du denn Performanz-Probleme mit deinen Datenbank-Abfragen?
        Nach meiner persönlichen Erfahrung ist MySQL selten der Flaschenhals.

        --
        “All right, then, I'll go to hell.”
  2. Unabhängig von der sonstigen Diskussion, mir fallen spontan Sessions ein.
    Nutze den Session-Mechanismus mit einer festen SessionID, so dass du bei allen Abfragen immer Zugriff auf die selben Sessiondaten hast. Da kannst du dir die Zeit der letzten Abfrage merken.

    1. Hello,

      Unabhängig von der sonstigen Diskussion, mir fallen spontan Sessions ein.
      Nutze den Session-Mechanismus mit einer festen SessionID, so dass du bei allen Abfragen immer Zugriff auf die selben Sessiondaten hast. Da kannst du dir die Zeit der letzten Abfrage merken.

      Diese Idee hatte ich auch schon. Das ist aber aufwändiger, als wenn ich selber eine Funktion erstelle, die eine für alle User gemeinsame Datei lesen und beschreiben kann, selbstverständlich unter Beachtung eines Locking-Mechanismus.

      Die Sessions haben den Nachteil, dass die Sessiondateien solange gesperrt bleiben, wie sie von einem User benutzt werden. Andere können also nicht darauf zugreifen.

      Man muss also erst di Session umschalten
      http://de2.php.net/manual/en/function.session-name.php

      dann starten
      [lonk:http://de2.php.net/manual/en/function.session-start.php]

      dann auslesen, Funktionen ausführen und zuückschreiben
      ...

      dann schließen
      http://de2.php.net/manual/en/function.session-write-close.php

      und dann wieder zurückschalten auf die zum User gehörige Session
      http://de2.php.net/manual/en/function.session-name.php

      Ich werde mich wohl nochmal mal mit Semaphoren und gemeinsamen Speicher beschäftigen...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Mahlzeit,

        bist du sicher, dass dieser Aufwand auch nur ansatzweise Zeit einspart gegenüber einer neuen Datenbankanforderung?

        --
        42
        1. Hello,

          bist du sicher, dass dieser Aufwand auch nur ansatzweise Zeit einspart gegenüber einer neuen Datenbankanforderung?

          Es geht mir darum, den DBMS-Server von jeder unnötigen Arbeit freizuhalten, denn da gibt es erstmal nur einen. Für die Ausführung der PHP-Scripte gibt es aber mehrere parallele Instanzen des Apachen.

          Das Nadelöhr bleibt dann das OS, das das Locking steuern muss.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://restaurant-zur-kleinen-kapelle.de
          1. Mahlzeit,

            Es geht mir darum, den DBMS-Server von jeder unnötigen Arbeit freizuhalten, denn da gibt es erstmal nur einen. Für die Ausführung der PHP-Scripte gibt es aber mehrere parallele Instanzen des Apachen.

            Dann mal ein Denkansatz, ohne etwas getestet zu haben.
            Du erzeugst alle X Sekunden einen eigenen Cache deiner Datenbank in einer extra Tabelle. Ausgelesen wird immer nur diese Tabelle, egal, wieoft das "Original" geändert wird.

            Oder:
            Du Cached Schreibinformationen und schreibst die Daten nur alle X Sekunden in die Datenbank.

            Ich gehe mal davon aus, Schreiboperation brauchen mehr Ressourcen als Leseoperationen, daher dürfte verzögertes Schreiben evtl. nochmal was bringen.
            Wie gesagt, nichts getestet, nur so ein Gedankenspiel. Wenns Unfug ist, einfach wieder vergessen ;)

            --
            42
      2. Ich meinte das anders.
        Wenn du eine Session innerhalb deines Programms mit einer immer gleichen ID bearbeitest, kannst du dir in ihr eine Zeit (und alles mögliche sonst) merken, die du von einem anderen Aufruf des Programms wieder abrufen kannst. Also nicht im gewohnten Sinn Sessions verwenden, sondern als Zwischenspeicher für einzelne Aufrufe deines Programms.
        (ich habs noch nie gemacht aber ich denke eine Session mit selbst erzeugter ID kann man machen?)

        Ich dachte das wäre deine Frage gewesen.

  3. wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

    Generell kann ich empfehlen, z.B. mal memcached auszuprobieren: http://www.memcached.org/
    Damit kann man eine Menge Ergebnisse aus Datenbank-Abfragen in Datenstrukturen zwischenspeichern. Entweder mit einem Expire-Datum, oder man löscht/überschreibt das gecachte Element explizit wieder.
    Z.b. die Liste der momentan eingeloggten User, die Forums-Beiträge/Threads der letzten 24h etc. Alles was relativ häufig abgefragt wird, aber sich nicht millisekundengenau im Frontend ändern muss.

    1. Hello,

      wie könnte man es (ohne die Verwendung einer Datei) schaffen, bestimmte Abfragen eines Forums nur z.B. einmal pro Sekunde neu durchzuführen?

      Generell kann ich empfehlen, z.B. mal memcached auszuprobieren: http://www.memcached.org/
      Damit kann man eine Menge Ergebnisse aus Datenbank-Abfragen in Datenstrukturen zwischenspeichern. Entweder mit einem Expire-Datum, oder man löscht/überschreibt das gecachte Element explizit wieder.
      Z.b. die Liste der momentan eingeloggten User, die Forums-Beiträge/Threads der letzten 24h etc. Alles was relativ häufig abgefragt wird, aber sich nicht millisekundengenau im Frontend ändern muss.

      Genau um solche Dinge geht es ja.

      Da hast Du dann plötzlich 150 User gleichzeitig am Zappen und die fordern (je nach Aufbau der Webseite) dann eben bis zu 50 mal die gleichen Ergebnisse an.

      Das muss ich der Datenbank nicht zumuten.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Genau um solche Dinge geht es ja.

        Da hast Du dann plötzlich 150 User gleichzeitig am Zappen und die fordern (je nach Aufbau der Webseite) dann eben bis zu 50 mal die gleichen Ergebnisse an.

        Das muss ich der Datenbank nicht zumuten.

        ähm, ja, daher empfahl ich ja memcached.
        war dein posting ein einwand oder eine zustimmung? konnte ich jetzt nicht so rauslesen.

        1. Hello,

          Genau um solche Dinge geht es ja.

          Da hast Du dann plötzlich 150 User gleichzeitig am Zappen und die fordern (je nach Aufbau der Webseite) dann eben bis zu 50 mal die gleichen Ergebnisse an.

          Das muss ich der Datenbank nicht zumuten.

          ähm, ja, daher empfahl ich ja memcached.
          war dein posting ein einwand oder eine zustimmung? konnte ich jetzt nicht so rauslesen.

          Na, doch wohl eher einer Zustimmung... ;-)

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://restaurant-zur-kleinen-kapelle.de