Memcached получает значение null для String, установленное с python, а затем получает из Java - PullRequest
8 голосов
/ 05 февраля 2010

Когда я пытаюсь прочитать строку из memcached, которую я установил в python:

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 говорит мне, что его не существует, и, очевидно, возвращает ноль, когда я пытаюсь его получить:

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
        }
}

Я предполагаю, что это как-то связано с сериализацией / несериализацией объектов на разных языках, но я подумал, что я могу быть в порядке для простых строк - кто-нибудь сталкивался с этим раньше?

Вот библиотеки, которые я использую:

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

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

Ответы [ 5 ]

4 голосов
/ 02 января 2011

Решение прямо из документации:

Если вам нужно поддерживать несколько клиенты (то есть Java, PHP, Perl и т. д.) вам нужно сделать несколько изменений, когда вы настраиваете вещи:

// 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 );
2 голосов
/ 05 октября 2015

изменить, чтобы использовать pylibmc, чтобы решить:

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
1 голос
/ 03 октября 2015

Это ошибка в вашем Java-клиенте. Вы должны получить разветвленный проект с исправлениями: https://github.com/zmokhtar/Memcached-Java-Client

EDIT

Я могу воспроизвести проблему с gwhalin / Memcached-Java-Client, но все нормально с zmokhtar / Memcached-Java-Client

1 голос
/ 19 сентября 2014

Убедитесь, что служба memcached запущена, если она уже запущена, перезапустите службу.

1 голос
/ 06 февраля 2010

Разве Java не использует юникод? Если это так, я подозреваю, что python пишет в memcache, используя набор символов ASCII / латинский 1. В результате ключи выглядят очень по-разному ("test_string" против "t \ 00e \ 00s \ 00t \ 00_ \ 00s \ 00t \ 00r \ 00i \ 00n \ 00g \ 00").

Попробуйте использовать это и посмотрите, что произойдет.

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...