我将添加到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获得设置项时,我会得到这个错误。请帮帮忙
发布于 2013-12-08 21:30:05
我复制了您的问题,我认为您不能在两个或多个会话中使用ArrayMemcachedSessionAllocator和One at a Time散列算法。
根据文档,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类的哈希算法。
https://stackoverflow.com/questions/20402213
复制相似问题