Ошибка установки xmemcached ArrayIndexOutOfBounds

Я добавляю на серверы в xmemcached и пытаюсь установить несколько пунктов. Я получаю это исключение

bar
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:371)
at java.util.ArrayList.get(ArrayList.java:384)
at net.rubyeye.xmemcached.impl.ArrayMemcachedSessionLocator.getSessionByKey(ArrayMemcachedSessionLocator.java:67)
at net.rubyeye.xmemcached.impl.MemcachedConnector.findSessionByKey(MemcachedConnector.java:570)
at net.rubyeye.xmemcached.impl.MemcachedConnector.send(MemcachedConnector.java:487)
at net.rubyeye.xmemcached.XMemcachedClient.sendCommand(XMemcachedClient.java:288)
at net.rubyeye.xmemcached.XMemcachedClient.fetch0(XMemcachedClient.java:617)
at net.rubyeye.xmemcached.XMemcachedClient.get0(XMemcachedClient.java:1030)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:988)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:999)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:1021)
at AxCacheEngine.Libs.AxMemcached.main(AxMemcached.java:33)

Вот код:

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(
            "127.0.0.1:11211 127.0.0.1:11311"
    ));
builder.setSessionLocator(new ArrayMemcachedSessionLocator(HashAlgorithm.ONE_AT_A_TIME));

MemcachedClient memcachedClient = builder.build();
System.out.println("Trying to get 1 milllion items");

int hugeItems = 0;
int normalItems = 0;
int totalCount = 0;

System.out.println(memcachedClient.set("foo",0,"bar"));
System.out.println(memcachedClient.set("bar",0,"baz"));
System.out.println(memcachedClient.set("yin",0,"yang"));

В чем может быть проблема? Есть ли какая-то проблема со стратегией распространения? Я получаю эту ошибку, когда пытаюсь получить набор элементов из php-memcached. Пожалуйста помоги

1 ответ

Решение

Я повторил вашу проблему, и я думаю, что вы не можете использовать ArrayMemcachedSessionAllocator с One at a Time алгоритм хеширования на 2 или более сеансов.

Согласно документации ArrayMemcachedSessionAllocator Класс находит Сессии как hash(key) mod sessions.size(),

И этот номер будет индексом Arraylist в коде. В частности, это виновная черта:

long start = this.getHash(size, key); //gets computed by ONE_AT_A_TIME hash % number of sessions
List<Session> sessions = sessionList.get((int) start); //this is where you get out of bounds

Проблема в том, что ONE_AT_A_TIME hash может быть отрицательным. Это негативно для bar (источник проблемы).

Так что, если у вас есть отрицательное значение хеша по модулю 2 (количество серверов), start тоже отрицательное значение.

С другой стороны, foo имеет положительное значение хеша для One_At_a_Time и по модулю 2 остается положительное значение!

Примечание. Алгоритм работает отлично, если у вас один сервер (так как любое число% 1 положительно).

Итак, я думаю, что вы просто не можете использовать этот алгоритм хеширования с ArrayMemcachedSessionAllocator класс для 2 или более серверов.

Другие вопросы по тегам