ubuntuusers.de

Key-Value-Memcache (wie zB Beaker, dogpile.cache)

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

snowblind

Avatar von snowblind

Anmeldungsdatum:
12. Mai 2011

Beiträge: 59

Hi,

ich habe eine Datenbank mit vielen Key-Value-Paaren und müsste folgendes realisieren:

  • Ein Cache-Mittelsmann, der von anderen Skripten aus ansprechbar ist

  • Will vom Cache-Mittelsmann zu einem Key einen Value haben

  • Dieser schaut ob es schon einen Cache gibt:

    • Wenn ja, liest er die Werte aus und gibt sie mir

    • Wenn nein, legt er einen an (im Speicher; Es werden alle Key-Value-Paare aus der DB reingeladen), der automatisch nach x Minuten verfällt (invalide wird). Dann liest er aus diesem Cache den Wert aus den ich haben will, und gibt ihn mir.

Ich hab mir hierzu schon Beaker und dogpile.cache angeschaut, leider werd ich dadraus nicht so ganz schlau, bzw. finde auch kein richtiges Tutorial / Schritt-für-Schritt Anleitung dazu. Nur aus den APIs komm ich damit nicht so klar.

Hat hierzu jemand Tipps, oder ne andere Empfehlung womit ich sowas realisieren kann?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

snowblind schrieb:

ich habe eine Datenbank mit vielen Key-Value-Paaren und müsste folgendes realisieren:

Was für eine Datenbank und wie sprichst Du mit ihr? Warum meinst Du, dass Du den Cache brauchst? RDBMS cachen typischerweise auch.

Hat hierzu jemand Tipps, oder ne andere Empfehlung womit ich sowas realisieren kann?

Schwierig bei der aktuellen Informationslage.

Ciao

robert

snowblind

(Themenstarter)
Avatar von snowblind

Anmeldungsdatum:
12. Mai 2011

Beiträge: 59

rklm schrieb:

Was für eine Datenbank und wie sprichst Du mit ihr? Warum meinst Du, dass Du den Cache brauchst? RDBMS cachen typischerweise auch.

MySQL. Ich spreche mit ihr per Python-DB-Handle.

Ich meine, dass ich den Cache brauche, weil es eine grosse DB und viele Abfragen sein werden, und sowas mit Sicherheit performanter ist wenn es aus dem Ram geholt werden kann (auch wenn DBMS'e sicher auch flott sind und evtl auch irgendwas irgendwo cachen). Es soll jedenfalls definitiv ein Key-Value-Cache dazukommen.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Na dann versuch Dich an memcached oder Redis ☺

snowblind

(Themenstarter)
Avatar von snowblind

Anmeldungsdatum:
12. Mai 2011

Beiträge: 59

@Lysander: Thx, hab ich mir grad angeschaut. Memcached bzw. pylibmc sehen recht passend aus; Wozu ich jedoch bisher noch garnichts finden konnte: Ich würde gerne beim erzeugen des Caches sagen "Du hast eine Lebensdauer von x Minuten, danach machst du dich selbst invalide / zerstörst dich selbst". Und nicht "Ich schaue alle x Minuten über alle Caches, und wenn ich welche finde die älter sind als X, zerstöre ich sie". Das erstere würde mir wesentlich praktischer und performanter vorkommen.

Gibts da eine Möglichkeit?

–-

edit: Habe grade zu (Python-)memcached gefunden, dass man mit dem Parameter time wohl eine Expirationtime setzen kann (→ http://stackoverflow.com/a/2524956/2496290 ). Werde das hier nochmal updaten, wenn ich was zum Laufen gebracht habe.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

snowblind schrieb:

rklm schrieb:

Was für eine Datenbank und wie sprichst Du mit ihr? Warum meinst Du, dass Du den Cache brauchst? RDBMS cachen typischerweise auch.

MySQL. Ich spreche mit ihr per Python-DB-Handle.

Aha. Danke!

Ich meine, dass ich den Cache brauche, weil es eine grosse DB und viele Abfragen sein werden, und sowas mit Sicherheit performanter ist wenn es aus dem Ram geholt werden kann (auch wenn DBMS'e sicher auch flott sind und evtl auch irgendwas irgendwo cachen). Es soll jedenfalls definitiv ein Key-Value-Cache dazukommen.

Ich habe folgendes Problem mit dieser Aussage: solange man so etwas nicht gemessen hat, ist alles wohlfeile Spekulation. Du machst Deine Softwarearchitektur komplizierter basierend auf bloßer Spekulation. Solange Du nur eine Tabelle mit zwei Spalten (Schlüssel und Wert) hast - und sei sie noch so groß - dann werden auch die Abfragen einfach sein und - passende Indizierung vorausgesetzt - schnell genug.

Ein Cache dazwischen macht die Sache nur komplizierter. Er kann sinnvoll sein, z.B. um die Latenz zu reduzieren, weil die DB auf einem weit entfernten Rechner läuft. Davon war aber bisher noch nicht die Rede. Falls der Cache auf der gleichen Maschine läuft wie die DB konkurriert er erst mal um Systemresourcen (CPU und Speicher) und es ist nicht von vornherein offensichtlich, dass er etwas bringt.

Ciao

robert

snowblind

(Themenstarter)
Avatar von snowblind

Anmeldungsdatum:
12. Mai 2011

Beiträge: 59

Hi rklm, danke für die anregenden Einwände.

Es geht hierbei jedoch weniger noch um die Performance, als um das Zusammenspiel mit der Validisierung. Es gibt mehrere Datenbanken, und je nach bestimmten Bedingungen werden beim "Beschreiben" des Caches manche Werte mehrfach überschrieben, bis letzendlich der "gültige" drin steht.

Kann da jetzt nicht weiter drauf eingehen, aber es macht in diesem Anwendungsfall definitiv Sinn, vereinfacht die Programmierstruktur drumrum, und wird letztlich auch Performance rausholen.

Aber wie gesagt, danke dass du Stoff zum Nachdenken gegeben hast!


Nun eine kurze Zusammenfassung meiner Erkenntnisse, wenn jmd auch mal mit memcached arbeiten will:

$ sudo apt-get install memcached python-memcache

Ersteres ist der Cache-Serverdienst, zweiteres die Schnittstelle, um mit Pyhon darauf zugreifen zu können.

Den Serverdienst kann man so kontrollieren:

$ service memcached status
 * memcached is running

Alternativ statt "status": "start", "stop"

In Python kann man dann so damit arbeiten:

>>> import memcache
>>> help(memcache)    # Dokumentation
>>> s = memcache.Client(["127.0.0.1:11211"])
>>> s.set("mykey", "myvalue")
True
>>> myvar = s.get("mykey")
>>> print(myvar)
myvalue
>>> s.delete("mykey")

Weiterhin gibt es noch folgende Commands: http://code.google.com/p/memcached/wiki/NewCommands

Weiteres überschaubares Tutorial zu memcached: http://blog.echolibre.com/2009/11/memcache-and-python-getting-started/

Und um memcached mit MySQL zu nutzen: http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-python.html

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

snowblind schrieb:

Hi rklm, danke für die anregenden Einwände.

Bitte.

Es geht hierbei jedoch weniger noch um die Performance, als um das Zusammenspiel mit der Validisierung.

Was ist "Validisierung"?

Es gibt mehrere Datenbanken, und je nach bestimmten Bedingungen werden beim "Beschreiben" des Caches manche Werte mehrfach überschrieben, bis letzendlich der "gültige" drin steht.

Dann ist es eher kein Cache. Du hast auch eingangs nicht erwähnt, dass Du Werte aus mehreren Datenbanken vorhalten willst. Solche Funktionalität wirst Du bei existierenden Produkten auch nicht unbedingt finden, denn die sind ja darauf ausgelegt, das zu tun, was ein Cache üblicherweise tut: nämlich einen Ausschnitt der Daten aus einem langsameren Speicher vorzuhalten.

Kann da jetzt nicht weiter drauf eingehen, aber es macht in diesem Anwendungsfall definitiv Sinn, vereinfacht die Programmierstruktur drumrum, und wird letztlich auch Performance rausholen.

Dann können wir Dir auch nicht wirklich mit Antworten dienen, die zu Deiner Problemstellung passen.

Ciao

robert

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

@snowblind: wenn ich das alles richtig verstehe, dann ist eher das bereits genannte Redis was für die. Ein sehr schnelles KV-Store, was ootb im RAM läuft, aber zusätzlich optionale Datenpersistenz bietet.

Ein paar Grundinfos findest im hier im Wiki, ausführlichere Infos in freiesMagazin Ausgabe 9/2102 und Ausgabe 10/2012.

Und Python-Bindings gibt's natürlich auch. Außerdem gibt es diverse ORMs für Python + Redis.

Gruß, noisefloor

snowblind

(Themenstarter)
Avatar von snowblind

Anmeldungsdatum:
12. Mai 2011

Beiträge: 59

Ohje, hab garnicht mitbekommen, dass hier noch was geschrieben wurde. Also dann:

rklm schrieb:

Es geht hierbei jedoch weniger noch um die Performance, als um das Zusammenspiel mit der Validisierung.

Was ist "Validisierung"?

Oh Wow, ich habe ein falsches Wort benutzt. Danke dass du mich darauf hinweist, sogar MIT Link zu Duden damit ich direkt sehe dass du recht hast! Ganz ehrlich, sowas lässt dich nicht sehr sympathisch erscheinen; aus meiner Sicht zumindest.

Es gibt mehrere Datenbanken, und je nach bestimmten Bedingungen werden beim "Beschreiben" des Caches manche Werte mehrfach überschrieben, bis letzendlich der "gültige" drin steht.

Dann ist es eher kein Cache. Du hast auch eingangs nicht erwähnt, dass Du Werte aus mehreren Datenbanken vorhalten willst.

Das war ja auch soweit nicht wichtig; Ich wollte ja nur eine Hilfestellung bei der Auswahl/Einrichtung eines Memcaches. Alles was danach kommt (Befüllen und Auslesen des Caches nach irgendeinem Schema, Auslesen des Caches nach irgendeinem Schema) wird selbst implementiert und spielt hier keine Rolle.

Solche Funktionalität wirst Du bei existierenden Produkten auch nicht unbedingt finden, denn die sind ja darauf ausgelegt, das zu tun, was ein Cache üblicherweise tut: nämlich einen Ausschnitt der Daten aus einem langsameren Speicher vorzuhalten.

S.o.: Ist mir klar, darum gehe ich ja auch davon aus das selbst zu implementieren, und frage hier nur nach einem Cache.

Kann da jetzt nicht weiter drauf eingehen, aber es macht in diesem Anwendungsfall definitiv Sinn, vereinfacht die Programmierstruktur drumrum, und wird letztlich auch Performance rausholen.

Dann können wir Dir auch nicht wirklich mit Antworten dienen, die zu Deiner Problemstellung passen.

Auch hier wieder: Die Probleme, wie der Cache gefüllt und gelesen wird, wurden hier bereits geklärt. Es geht/ging nur noch um einen brauchbaren Cache. Und nebenbei kann ich nunmal einfach nicht auf alle Einzelheiten eingehen, die sich hier in der Firma ergeben (würde sowieso den Rahmen sprengen).

noisefloor schrieb:

@snowblind: wenn ich das alles richtig verstehe, dann ist eher das bereits genannte Redis was für die. Ein sehr schnelles KV-Store, was ootb im RAM läuft, aber zusätzlich optionale Datenpersistenz bietet.

Vielen Dank für den Hinweis. S.o.: Ein "üblicher" Cache wie Memcache war vom Funktionsumfang durchaus ausreichend. Und da hier sowieso schon Memcache für (komplett) andere Projekte verwendet wird, war ein weiterer Memcache-Server gerade sozusagen aus dem Ärmel zu schütteln.

Zum Theme "Cache überhaupt sinnvoll": Auch bzgl. Performance lohnt es sich (bzw. wird sich lohnen) insofern, als dass später recht viele Clienten auf diesen Cache (gefüllt mit diversen redundanten, sich überlagernden Keys) zugreifen werden.

Mittlerweile hat das auch alles gut geklappt, die Clients in PHP, Python und Perl laufen; Das System, das einem Key den richtigen Value in abhängigkeit vom Client zuordnet, funktioniert; Usw. Ich danke für die Hilfe, ich hab genau das gefunden was ich gesucht hatte.

Antworten |