Hallo,
gleich mal vorweg: DIE NÄCHSTEN 11 FORUM-EINTRÄGE KÖNNEN
IGNORIERT WERDEN. Interessant wird es dann erst wieder
ab 24-09-2007 20:03.
Ich beschäftigte mich momentan mit memcache.
Wenn ich das richtig verstanden habe, werden bei einem add alte Einträge
automatisch gelöscht, sofern kein freier RAM-Speicher mehr zur Verfügung
steht.
Habe daraufhin folgendes Testprogrämmchen laufen lassen:
add liefert leider keine Rückmeldung, falls memcache gezwungen wäre,
Daten aus dem RAM zu löschen, um einen neuen Eintrag im RAM
abspeichern zu können, wenn der RAM schon voll ist.
getStats scheint auch keine Informationen zu liefern, anhand dessen man
schon VOR einem add kontrollieren könnte, ob die Daten gepeichert
werden können, ohne dass andere Daten aus dem RAM gelöscht werde
müssen.
Wie kann ich verhindern, dass Daten automatisch und ohne Meldung aus
dem RAM gelöscht werden, wenn ich mittels add etwas ins RAM eintragen
möchte, das RAM jedoch schon voll ist? Gibt es eine Möglichkeit, auf einen
möglichen Datenverlust reagieren zu können?
Hier noch Ausschnitte aus der Ausgabe des Scripts:
Wie man sieht, befinden sich nur 2208 statt der 6400 Daten tatsächlich im RAM.
Mit bytes_written ist VOR einem add wohl keine Kontrolle möglich, da es
nicht die Bytes jener Daten wiedergibt, die man abspeichern möchte
(siehe Vergleich zu bytes).
Auf bytes kann man sich auch nicht verlassen, da es schon bei wesentlich
weniger als den 64MB zu Datenverlusten gekommen ist.
cmd_set gibt leider nur an, wie oft ein add ausgeführt wurde.
cur_items kann auch nicht für die Kontrolle herangezogen werden, da
Daten ja auch kontrolliert (nach Ablauf einer gewissen Dauer - im meinem
Beispiel 1 Minute) automatisch aus dem RAM gelöscht werden könnten.
Hintergrundinfo: Ich möchte ein RAM-Caching für den laufenden Text eines
Chats verwenden. Diese Texte sollen ausschließlich nur im RAM
zwischengespeichert werden. Alle anderen Sachen, wie z. B.
Authentifizierung oder Profile läufen dann über MySQL oder LDAP(BDB).
Würde mich freuen, von Leuten Hilfe zu bekommen, die schon mal mit
memcache oder RAM-Caching zu tun hatten.
gleich mal vorweg: DIE NÄCHSTEN 11 FORUM-EINTRÄGE KÖNNEN
IGNORIERT WERDEN. Interessant wird es dann erst wieder
ab 24-09-2007 20:03.
Ich beschäftigte mich momentan mit memcache.
Wenn ich das richtig verstanden habe, werden bei einem add alte Einträge
automatisch gelöscht, sofern kein freier RAM-Speicher mehr zur Verfügung
steht.
Habe daraufhin folgendes Testprogrämmchen laufen lassen:
PHP Code:
<?php
define('STR_CNT','6400'); // Anzahl der Einträge in das RAM.
define('N_CNT' ,(int)STR_CNT);
define('N_PAD' ,strlen(N_CNT));
function getKey($__nI)
{ /**
* Erzeugt einen Schlüssel.
* @param $__nI: Number
* Index, fortlaufende Nummer, Teil des Schlüssels.
* @return: String
* Der Schlüssel besteht aus dem Präfix 'k' und dem $__nI als Suffix (4stellig)
*/
return 'k'.str_pad($__nI,N_PAD,'0',STR_PAD_LEFT);
}
$oRAM=new Memcache();
if(@$oRAM->connect('127.0.0.1'))
{ /*
* abzuspeichernder Value:
*/
$strV='';
for($nJ=0;$nJ<1024;++$nJ) // 1024 * 10 => 10kB
for($nI=0;$nI<10;++$nI) // 10 => 10B
$strV.=$nI;
/*
* Values in RAM speichern:
*/
for($nI=0;$nI<N_CNT;++$nI) // 10kB * 6400 => 64MB Value (exkl. Key)
echo ( $oRAM->add(getKey($nI),$strV,false,60) // 1 Minute
? 'o'
: 'n'
).
' '.$nI.'<br />';
/*
* Values aus RAM auslesen:
*/
for($nI=0;$nI<N_CNT;++$nI)
{ $strKey=getKey($nI);
echo $strKey.': ';
var_dump($oRAM->get($strKey));
echo '<br />';
}
/*
* memcache-Stati auslesen:
*/
$oDump=$oRAM->getStats();
if(is_array($oDump))
var_dump($oDump);
}
?>
Daten aus dem RAM zu löschen, um einen neuen Eintrag im RAM
abspeichern zu können, wenn der RAM schon voll ist.
getStats scheint auch keine Informationen zu liefern, anhand dessen man
schon VOR einem add kontrollieren könnte, ob die Daten gepeichert
werden können, ohne dass andere Daten aus dem RAM gelöscht werde
müssen.
Wie kann ich verhindern, dass Daten automatisch und ohne Meldung aus
dem RAM gelöscht werden, wenn ich mittels add etwas ins RAM eintragen
möchte, das RAM jedoch schon voll ist? Gibt es eine Möglichkeit, auf einen
möglichen Datenverlust reagieren zu können?
Hier noch Ausschnitte aus der Ausgabe des Scripts:
Code:
o 0 … o 6399 k0000: bool(false) … k4191: bool(false) k4192: string(10240) "0123…" … k6399: string(10240) "0123…" array(18) { … ["curr_items"] =>string(4) "2208" Akt. Anz. im RAM befindlicher Einträge. Sollten 6400 sein. ["total_items"] =>string(4) "6400" ["bytes"] =>string(8) "22720320" ["cmd_get"] =>string(4) "6400" Hier sieht man, dass die Anzahl der Speicher- und ["cmd_set"] =>string(4) "6400" Lese-Vorgänge gleich ist. ["get_hits"] =>string(4) "2208" Anz. erfolgreicher Versuche, Daten auszulesen. Sollte 6400 sein. ["get_misses"] =>string(4) "4192" Anz. fehlgeschlagener Versuche, Daten auszulesen. Sollte 0 sein. ["bytes_read"] =>string(8) "65760007" ["bytes_written"] =>string(8) "22743904" ["limit_maxbytes"]=>string(8) "67108864" Zur Verfügung stehender RAM-Speicher (64MB). }
Mit bytes_written ist VOR einem add wohl keine Kontrolle möglich, da es
nicht die Bytes jener Daten wiedergibt, die man abspeichern möchte
(siehe Vergleich zu bytes).
Auf bytes kann man sich auch nicht verlassen, da es schon bei wesentlich
weniger als den 64MB zu Datenverlusten gekommen ist.
cmd_set gibt leider nur an, wie oft ein add ausgeführt wurde.
cur_items kann auch nicht für die Kontrolle herangezogen werden, da
Daten ja auch kontrolliert (nach Ablauf einer gewissen Dauer - im meinem
Beispiel 1 Minute) automatisch aus dem RAM gelöscht werden könnten.
Hintergrundinfo: Ich möchte ein RAM-Caching für den laufenden Text eines
Chats verwenden. Diese Texte sollen ausschließlich nur im RAM
zwischengespeichert werden. Alle anderen Sachen, wie z. B.
Authentifizierung oder Profile läufen dann über MySQL oder LDAP(BDB).
Würde mich freuen, von Leuten Hilfe zu bekommen, die schon mal mit
memcache oder RAM-Caching zu tun hatten.
Comment