Ankündigung

Einklappen
Keine Ankündigung bisher.

NoSQL

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • NoSQL

    http://www.heise.de/developer/artike...k-1233843.html

    Ein Beispiel ist die Sessionverwaltung in einem Websystem. Über einen Key (etwa aus einem Cookie-Wert) hinterlegt man den aktuellen Zustand einer Websession und kann ihn dadurch bei späteren Zugriffen auslesen und überschreiben.
    Was könnte denn mit diesem "aktuellen Zustand einer Websession" gemeint sein? Kann sich irgendwer etwas darunter vorstellen?

  • #2
    Die Menge aller Daten, die im Zeitraum der Sitzung für einen Client serverseitig verwaltet wird.

    http://de.wikipedia.org/wiki/Session...auf_dem_Server

    Kommentar


    • #3
      HTTP ist ein statusloses, also zustandsloses Protokoll. Das kannst du dir etwa so vorstellen:



      Heißt, ein Server weiß nicht, ob zwei Requests auch vom gleichen Client kommen. Sessions überbrücken dies in gewisser Weise, indem der Client immer eine Session-ID mitliefert anhand derer der Server den Client wiedererkennen kann.
      Mit dem Zustand der Session ist allgemein der requestübergreifende Zustand der Kommunikation bzw. der ausgetauschten Daten zwischen Client und Server gemeint (Client ist ein-/ausgeloggt, Client ist dabei eine Serie von Bildern hochzuladen, Client hat Name XYZ, Client ist doof usw. usf.).

      Kommentar


      • #4
        Womit ich Probleme habe, ist, wie der Bezug der Session-ID zu den Session-Daten ist.

        Im Session-Cookie steht die Session-ID.
        Über session_id kann ich diese ID auslesen.
        Somit kennt dann PHP die Session-ID eines bestimmten Prozesses.

        Die NoSQL-DB speichert Key-Value-Paare.
        Wenn man also die Session-Daten in der NoSQL-DB speichert, steht dann z. B.:

        UserID: 35
        Login: 2011-05-01 22:11:00

        Aber wie stellt man den Bezug von der im PHP bekannten Session-ID zu diesen in der NoSQL-DB gespeicherten Session-Daten her?

        Kommentar


        • #5
          Wenn du einen eigenen Session-Mechanismus implementieren willst, musst du das, was sonst PHP für dich tut, selbst machen: die Daten in Zusammenhang mit der Session-ID speichern. Die Session-ID ist die ID des Session-Eintrags unter dem all die Daten gespeichert werden. Das lässt sich sowohl in NoSQL-Datenbanken abbilden als auch in relationalen Datenbanken mittels PK/FK-Beziehungen.

          Kommentar


          • #6
            Du kannst einen Session-Save-Handler definieren, der dir die Session-Daten in NoSQL speichert: http://www.php.net/manual/en/functio...ve-handler.php

            Kommentar


            • #7
              Ein eigener Session-Handler nimmt mir die Arbeit nicht ab, dass ich von der Session-ID einen Bezug zu den NoSQL-Einträgen herstellen muss.

              Wie man das mit einer relationalen Datenbank macht, weiß ich. Das ist kein Problem. Aber ich kann mir nicht vorstellen, wie das mit einer NoSQL-Key-Value-Datenbank - wie z. B. redis - dann aussehen muss.

              EDIT:

              Muss die Session-ID dann Teil der Keys sein? Oder kann man in redis auch Baumstrukturen aufbauen? Dass die Session-IDs in der obersten Ebene liegen und darunter die eigentlichen Session-Daten als Key-Value-Paare?

              Kommentar


              • #8
                Auch SessionID : {complexDataType} ist ggf. ein Key-Value-Paar.

                Wenn die DB bzw. Schnittstelle es nicht unterstützt, direkt komplexe Datentypen zu übergeben, müsstest du die entweder ein Einzelteile aufsplitten (SessionID.counter : {simpleDataType}), oder eine serialisierte Form abspeichern.

                Redis kenne ich persönlich nicht.
                MongoDB nutzt bspw. JSON-style Documents.

                Kommentar


                • #9
                  Damit sollte mir jetzt hoffentlich die Theorie klar sein. Danke für die Infos.

                  Jetzt zur Installation unter Win XP.

                  Lädt man sich Redis von https://github.com/dmajkic/redis/downloads runter, findet man dort die Datei README-Windows.txt:

                  Building Redis on Windows
                  -------------------------

                  Building Redis on Windows requires MinGW. If you are using full
                  msysGit, you allready have all tools needed for the job.

                  Start Git bash, and clone this repository:

                  $ git clone http://github.com/dmajkic/redis.git

                  Compile it:

                  $ make

                  Test it:

                  $ make test

                  Compiled programs are in source dir, and have no external dependencies.

                  Windows x64 port notice
                  -----------------------

                  Since there are more diferences between Linux and Windows 64bit systems,
                  and even if all tests suplied with redis pass, this port should be
                  treated as experimental build, in need for more testing.

                  To build it yourself you will need x64 gcc compiler (TDM or like).
                  Build procedure is same as 32 bit version.

                  On 64bit windows, you can start 64bit redis-server from 32bit app
                  and use it to access more than 3,5Gb memory.
                  Das verwirrt mich wirklich alles. Zuerst wird geschrieben, man benötige MinGW. Danach ist jedoch von GCC die Rede. Beinhaltet MinGW GCC?

                  Der GIT-clone-Befehl hat bei mir funktioniert. MinGW habe ich installiert und PATH erweitert. Wie lautet jetzt der Kompilierbefehl mit MinGW?

                  Redis liegt bei mir unter C:\redis. Die Source-Dateien liegen unter C:\redis\src
                  Der Befehl zum Kompilieren heißt bei MinGW nicht make, sondern mingw32-make

                  Ein Kompilierversuch liefert jedoch nur (mir unverständliche) Fehler:
                  C:\redis\src>mingw32-make
                  process_begin: CreateProcess(NULL, sh -c ./mkreleasehdr.sh, ...) failed.
                  process_begin: CreateProcess(NULL, sh -c "uname -s 2>/dev/null || echo not", ...
                  ) failed.
                  Der Befehl "uname" ist entweder falsch geschrieben oder
                  konnte nicht gefunden werden.
                  cd ../deps/hiredis && mingw32-make static ARCH=""
                  process_begin: CreateProcess(NULL, sh -c "uname -s 2>/dev/null || echo not", ...
                  ) failed.
                  Der Befehl "uname" ist entweder falsch geschrieben oder
                  konnte nicht gefunden werden.
                  mingw32-make[1]: Entering directory `C:/redis/deps/hiredis'
                  cc -c -std=c99 -pedantic -O3 -fPIC -Wall -W -Wwrite-strings -g -ggdb net.c
                  process_begin: CreateProcess(NULL, cc -c -std=c99 -pedantic -O3 -fPIC -Wall -W -
                  Wwrite-strings -g -ggdb net.c, ...) failed.
                  make (e=2): Das System kann die angegebene Datei nicht finden.
                  mingw32-make[1]: *** [net.o] Error 2
                  mingw32-make[1]: Leaving directory `C:/redis/deps/hiredis'
                  mingw32-make: *** [dependencies] Error 2

                  Kommentar


                  • #10
                    Um mit MinGW kompilieren zu können, scheint man nicht nur MinGW, sondern zusätzlich noch cygwin zu benötigen. Warum, verstehe ich aber nicht. Auf jeden Fall kommen dann weniger Fehler.

                    Einer der Fehler, der beim Kompilieren noch kommt ist, dass release.h nicht gefunden werden kann.
                    Diese Fehlermeldung habe ich wegbekommen, indem ich selbst eine leere Datei C:\redis\src\release.h angelegt habe.

                    Mein aktueller Stand:

                    C:\redis\src>mingw32-make
                    cd ../deps/hiredis && mingw32-make static ARCH=""
                    mingw32-make[1]: Entering directory `C:/redis/deps/hiredis'
                    cc -c -std=c99 -pedantic -O3 -fPIC -Wall -W -Wwrite-strings -g -ggdb net.c
                    process_begin: CreateProcess(NULL, cc -c -std=c99 -pedantic -O3 -fPIC -Wall -W -
                    Wwrite-strings -g -ggdb net.c, ...) failed.
                    make (e=2): Das System kann die angegebene Datei nicht finden.
                    mingw32-make[1]: *** [net.o] Error 2
                    mingw32-make[1]: Leaving directory `C:/redis/deps/hiredis'
                    mingw32-make: *** [dependencies] Error 2
                    C:/redis/deps/hiredis/net.c existiert bei mir. Also gehe ich davon aus, dass mir cc.exe noch fehlt. Wieder etwas, was ich nicht verstehe. MinGW und cygwin habe ich schon installiert. Also wozu noch cc? Was soll der Blödsinn? Woher komme ich für Windows diesen Compiler CC?

                    Kommentar


                    • #11
                      meine Güte - warum willst du eine UNIX / LINUX Datenbank unter windoof zum laufen bringen ?

                      nimm doch gleich eine die NATIV unter Windows läuft

                      zum Verständnis . cygwin und MinGW simulieren ein Linux-System unter windows

                      Kommentar


                      • #12
                        Zitat von poli-tik Beitrag anzeigen
                        Jetzt zur Installation unter Win XP.

                        Lädt man sich Redis von https://github.com/dmajkic/redis/downloads runter, findet man dort die Datei README-Windows.txt: [...]
                        Oder man ignoriert die Readme und nimmt einfach die fertigen Windows Binaries die mit in dem Archiv sind.

                        Kommentar


                        • #13
                          Oder man ignoriert die Readme und nimmt einfach die fertigen Windows Binaries die mit in dem Archiv sind.
                          Stimmt. Die Sache bin ich falsch angegangen!
                          Funktioniert jetzt.

                          Nur eines stört mich noch.
                          Starte ich unter binary\32bit den Server mit radis-server, werden laufend Debugging-Informationen ausgegeben. Kennt zufällig wer eine Möglichkeit, wie man das unterbinden kann?

                          Hier ein Auszug dieser Debugging-Infos:
                          [6016] 05 May 11:40:39 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:40:44 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:40:44 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:40:50 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:40:50 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:40:55 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:40:55 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:41:01 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:41:01 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:41:06 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:41:06 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:41:12 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:41:12 - 0 clients connected (0 slaves), 417716 bytes in use
                          [6016] 05 May 11:41:17 - DB 0: 2 keys (0 volatile) in 4 slots HT.
                          [6016] 05 May 11:41:17 - 0 clients connected (0 slaves), 417716 bytes in use
                          Ich gehe davon aus, dass man über die config (Beispiel http://code.google.com/p/redis/sourc...edis.conf?r=54) bestimmen kann, ob mitdebuggt werden soll.

                          Kommentar


                          • #14
                            tja .. dann schau mal selbst in das Dokument rein .. du willst uns doch wohl jetzt nicht erzählen, dass es an ein wenig Informatik-Schulenglisch hapert?

                            Zeile 36 steht was du brauchst - Zeile 38 ist die Konfig-Option, die du ändern musst

                            Kommentar


                            • #15
                              Wunderbar. Habe die Änderung in der mitgelieferten config durchgeführt. Passt jetzt.
                              Habe zwar noch eine Fehlermeldung, aber die interessiert mich vorerst nicht.

                              Danke für die zahlreiche Unterstützung.

                              Kommentar

                              Lädt...
                              X