Key-Value Store für Python 3

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Ich suche einen key-value store, für den es einen vernünftigen python 3 client gibt.
Ich habe bisher memcache verwendet, aber das 1MB pro Item Limit macht mir zu schaffen. Ich frage eine DB ab und erhalte da ziemlich große Ergebnise (bisher max. 20MB).

Im Prinzip suche ich sowas wie memcache (vor allem das man angeben kann wie langer der Wert vorgehalten werden soll fan dich klasse), nur ohne das Limit :)
Ich habe zwar gelesen das man das Limit bei memcache erhöhen kann, aber ich denke die Leute werden sich da schon etwas bei gedacht haben :) Ich hab's auch schon versucht und bei richtig großen values kackt der Service jedes mal ab.

Erfahrungen, Empfehlungen, Ideen ?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Superstar ;-) unter den KV-Stores ist Redis (http://redis.io). Dafür gibt's auch eine P3 Anbindung (http://pypi.python.org/pypi/redis).

Ich habe für freies Magazin mal eine Artikel zu Redis geschrieben (Link. In dem solltest du einen guten Überblick über die Möglichkeiten von Redis bekommen.

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Nachtrag: Redis erlaubt Werte bis zu einer Größe von 512 MB.

Gruß, noisefloor
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Danke, Redis scheint echt perfekt zu sein.
Ich habe aber schon das 1. Problem und hoffe du kannst mir helfen :)

Ich verwende Redis in der Version 2.4.
Ich will eigentlich eine Python Liste von Python Listen unter einem key speichern.

Das scheint nicht zu klappen, deswegen pickle ich jetzt meine Liste zu einem byte-wert.
Ich müsste jetzt also nur mehr eine Liste von bytes unter einem key speichern.
Ich dachte eigenltich das lpush dafür gedacht sei aber ich kriege ständig den Fehler, das der key das falsche value halten würde.

Hier mein Code:

Code: Alles auswählen

job_atts = pickle.dumps([event.job, event.exception, datetime.now()])
REDIS_CLIENT.lpush('jobs_fail', job_atts)
Error:

Code: Alles auswählen

redis.exceptions.ResponseError: Operation against a key holding the wrong kind of value
Noch dazu würde ich gerne eine expiration auf die items setzen, aber das scheint ja gar nicht vorgesehen zu sein....wäre aber auch nicht soooo schlimm.

//EDIT:

Der Fehler kam beim lesen der Values. Da muss man dann natürlich lrange verwenden.....-.-
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Noch dazu würde ich gerne eine expiration auf die items setzen,
Redis kennt EXPIRE, mit dem man die Lebensdauer eines Schlüssels setzen kann. Das geht AFAIR mit allen Datentypen. Doku: http://redis.io/commands/expire

Gruß, noisefloor
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

noisefloor hat geschrieben:Hallo,
Noch dazu würde ich gerne eine expiration auf die items setzen,
Redis kennt EXPIRE, mit dem man die Lebensdauer eines Schlüssels setzen kann. Das geht AFAIR mit allen Datentypen. Doku: http://redis.io/commands/expire

Gruß, noisefloor

Danke für den Tipp. Ich verwende jetzt ltrim, was sowieso besser für mich geeignet ist :)
Antworten