2010-02-05 5 views
8

Kiedy próbuję czytać String z memcached, że ustawione w python:Memcached coraz null dla String zestaw z pytona, a następnie uzyskać z Java

import memcache 

MC_SERVER = "192.168.1.100" 
MC_PORT = "11211" 

mc = memcache.Client(['%s:%s' % (MC_SERVER, MC_PORT)], debug=0) 
mc.set("test_string", "true") 
print mc.get("test_string") 

Java mówi mi to nie istnieje i oczywiście zwraca null gdy próbuję dostać go:

import com.danga.MemCached.*; 
public class Tester { 

     // create a static client as most installs only need 
     // a single instance 
     protected static MemCachedClient mcc = new MemCachedClient(true, false); 

     // set up connection pool once at class load 
     static { 

       // server list and weights 
       String[] servers = 
         { 
          "192.168.1.100:11211" 
         }; 

       // grab an instance of our connection pool 
       SockIOPool pool = SockIOPool.getInstance(); 

       // set the servers and the weights 
       pool.setServers(servers); 

       // set some TCP settings 
       // disable nagle 
       // set the read timeout to 3 secs 
       // and don't set a connect timeout 
       pool.setNagle(false); 
       pool.setSocketTO(3000); 
       pool.setSocketConnectTO(0); 

       // initialize the connection pool 
       pool.initialize(); 
     } 

     // from here on down, you can call any of the client calls 
     public static void main(String[] args) { 
       //System.out.println(mcc.set("test_string", "blah!")); // everything is great is value is set by Java 
       System.out.println(mcc.keyExists("test_string")); // output is false when value set by python 
       System.out.println(mcc.get("test_string")); // output is null when value set by python 
     } 
} 

jestem zgadywania, że ​​ma coś wspólnego z serializacji obiektu/un-serializacji w różnych językach, ale myślałem, że mogę być OK dla prostych Strings - ktoś napotkasz tego wcześniej?

Oto libs używam:

http://www.tummy.com/Community/software/python-memcached/

http://github.com/gwhalin/Memcached-Java-Client/downloads

+0

należy zrobić pełne rejestrowanie na serwerze memcached i upewnij się, że to, co myślisz, że dzieje się rzeczywiście dzieje. –

+0

Dobra sugestia, ale w rzeczywistości nie mam dostępu do tego konkretnego serwera memcached. Próbowałem tej drugiej biblioteki java i wygląda na to, że działa zgodnie z oczekiwaniami: http://code.google.com/p/spymemcached/ Wciąż chciałbym wiedzieć, dlaczego inne lib nie działa - po prostu ciekawy. – jckdnk111

+0

Możliwe, że nie może zrozumieć wartości zwracanej. Możesz skonfigurować spymemcached do emulowania transkodera Whalin i sprawdzić, czy również nie. – Dustin

Odpowiedz

1

Nie Java użycie unicode? Jeśli tak, podejrzewam, że python zapisuje do memcache przy użyciu zestawu znaków ASCII/latin 1. W rezultacie klucze wyglądają bardzo różnie ("test_string" kontra "t \ 00e \ 00s \ 00t \ 00_ \ 00s \ 00t \ 00r \ 00i \ 00n \ 00g \ 00").

Spróbuj użyć tego i zobacz, co się stanie.

import memcache 

MC_SERVER = "192.168.1.100" 
MC_PORT = "11211" 

mc = memcache.Client(['%s:%s' % (MC_SERVER, MC_PORT)], debug=0) 
mc.set(u"test_string", u"true") 
print mc.get(u"test_string") 
+0

Dobry pomysł, niestety python lib nie może obsłużyć kluczy Unicode: memcache.MemcachedStringEncodingError: Klucze muszą być str(), a nie unicode. Konwertuj ciągi znaków Unicode za pomocą mystring.encode (charset) Próbowałem również metody mystring.encode ("utf-8") i chociaż pozbyłem się wyjątku Pythona, nie rozwiązało to problemu. – jckdnk111

+0

Myślę, że Java używa utf-16 do swojego natywnego kodowania, więc spróbuj "utf-16", "utf-16le" i "utf-16be" dla zestawu znaków. Opcje le/be mogą, ale nie muszą być konieczne. –

+0

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/python_memcached-1.58-py3.4.egg/memcache.py ", wiersz 1077, w _get if server.connect (): Plik "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/python_memcached-1.58-py3.4.egg/memcache.py", wiersz 1065, w _unsafe_get , jeśli isinstance (msg, tuple): Plik "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/python_memcached-1.58-py3.4.egg/memcache.py", wiersz 1257 , w _recv_value def check_key (self, key, key_extra_len = 0): ValueError: Nieznane flagi przy pobieraniu: 200 – Gank

4

Rozwiązanie prosto z dokumentacją:

If you need to support multiple clients (i.e. Java, PHP, Perl, etc.) you need to make a few changes when you are setting things up:

// use a compatible hashing algorithm 
pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH); 

// store primitives as strings 
// the java client serializes primitives 
// 
// note: this will not help you when it comes to 
// storing non primitives 
mcc.setPrimitiveAsString(true); 

// don’t url encode keys 
// by default the java client url encodes keys 
// to sanitize them so they will always work on the server 
// however, other clients do not do this 
mcc.setSanitizeKeys(false); 
+0

To działało na mój problem z używaniem interfejsu telnet memcache, a następnie próbuje odzyskać te wartości przy użyciu api java memcached (com.danga). Jeden z przykładów miejsca, w którym znajduje się dokumentacja wymieniona w tej odpowiedzi: http://www.geelou.com/javadocs/java_memcached-release_2.0.1/com/danga/MemCached/SockIOPool.html – Paul

+0

nie działa: 'ValueError: Unknown flags on get: 20' – Gank

+0

@Gank, jakich bibliotek/wersji używasz? – ilj

1

Upewnij się, że memcached usługa jest uruchomiona, jeżeli jest już rozpoczął następnie ponownie uruchomić usługę.

+0

nie działa: 'ValueError: Nieznane flagi przy pobieraniu: 20' – Gank

2

zmian używać pylibmc go rozwiązać:

import pylibmc 

mc = pylibmc.Client(["127.0.0.1"], binary=True, 
        behaviors={"tcp_nodelay": True, 
           "ketama": True}) 

key="someKey" 
i=0 
while True: 
    #mc.set(key, str(i)) 
    value = mc.get(key) 
    print(value) 
    sleep(1) 
    i+=1 
Powiązane problemy