Elemente, die mit spymemcached gesetzt wurden, können nicht mit php memcached abgerufen werden

8

Ich benutze spionmcached. Ich habe ein paar Sachen eingestellt. Dann starte ich ein PHP-Skript, aber dann kann ich nicht alle diese Elemente mit php memcached bekommen. PHP-Memcached kann diese Elemente nur teilweise abrufen.

Ich kann den Hash-Algorithmus oder die Verteilungsstrategie von PHP nicht ändern. In unserem System verwenden wir Standard-Hashing (was jenkins nach php.net-Dokumentation ist). Und Verteilungsstrategie ist modulo für php-memcached. Ich habe gelesen, dass spionemcached konsistente Hashing verwendet. Gibt es einen Weg, wie ich modulo Hashing in spionemcached verwenden kann.

Mit anderen Worten, wie kann ich die set-Operationen von spymemcached oder andere Speicheroperationen, die mit den get-Operationen von php-memcached kompatibel sind, machen?

Wenn spygemcached das nicht kann, gibt es einen anderen memcached Client in Java, der mir das erlaubt?

Hilfe wird nicht nur geschätzt, es wird auch eine Prämie belohnt.

Java-Code:

%Vor%

PHP-Code:

%Vor%     
Shades88 25.09.2013, 15:25
quelle

3 Antworten

9

Das Problem ist Hash, der standardmäßige php-memcached-Hash ist

  

(Jenkins einzeln) Elementschlüssel Hash-Algorithmus

wobei die Liste der spioncached Hashes lautet:

  • NATIVE_HASH : simply Native hash (String.hashCode()). stimmt nicht mit default überein php-memcached Memcached::HASH_DEFAULT
  • CRC_HASH = & gt; %Code%
  • Memcached::HASH_CRC = & gt; %Code%
  • FNV1_64_HASH = & gt; %Code%
  • Memcached::HASH_FNV1_64 = & gt; %Code%
  • FNV1A_64_HASH = & gt; %Code%
  • Memcached::HASH_FNV1A_64 = & gt; "MD5-basierter Hash-Algorithmus, der von Ketama verwendet wird." Also vielleicht FNV1_32_HASH , aber trotzdem nicht Memcached::HASH_FNV1_32

Es gibt also keinen direkten Vergleich zwischen den beiden Bibliotheken, wenn Sie die PHP-Client-Konfiguration nicht ändern oder die spy-memcached-Bibliothek erweitern können.

SOLUTION 1: Wenn Sie sich history ansehen (Sie können ein Beispiel mit php Client-Hash-Änderung).

LÖSUNG 2: Andernfalls können Sie eine JenkinHash-Klasse erstellen (ich kopiere den Xmemcached-Code nach: Ссылка [Bitte beachten Sie die Xmemcached-Lizenzen und behalten Sie den Autor / die Lizenz im Quellcode] )

%Vor%

dann:

%Vor%

Mit PHP-Skript:

%Vor%

test:

%Vor%

LÖSUNG 3: Verwenden Sie Ссылка mit dem FNV1A_32_HASH Hash-Algorithmus

%Vor%     
Kakawait 03.10.2013, 09:07
quelle
3

Hash-Algorithmen, die spymemcached unterstützt, finden Sie hier: Ссылка

Sie sollten in der Lage sein, den Hash-Algorithmus zu ändern, indem Sie eine ConnectionFactory verwenden, um Ihren MemcachedClient zu erstellen. Tun Sie etwas wie folgt:

%Vor%     
mikewied 25.09.2013 21:29
quelle
1

Re: Kakawait (und auch zu Shades88)

Lösung # 2 ist falsch, weil xmemcached den ursprünglichen C-Code des Jenkins-Hashs, der ein unsigned verwendet, nicht richtig portiert hat. Das zu beheben wird auch die ArrayIndexOutOfBoundsException lösen, die Shades88 sehen konnte.

%Vor%

Die Testdatendatei vergleicht den Java-Code mit dem C-Code. Erstellen Sie den C-Code, hacken Sie dann eine Menge zufälliger Wörter und ordnen Sie sie in einer Datei wie folgt an:

jenkinsHashTest.dat:

%Vor%

... füge so viele hinzu, wie du möchtest

    
spudone 03.01.2014 18:17
quelle

Tags und Links