Ошибка установки 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 или более серверов.