首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmemcached集错误ArrayIndexOutOfBounds

xmemcached集错误ArrayIndexOutOfBounds
EN

Stack Overflow用户
提问于 2013-12-05 14:10:49
回答 1查看 176关注 0票数 1

我将添加到xmemcached服务器,并尝试设置几个项。我明白这个例外

代码语言:javascript
复制
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)

下面是代码:

代码语言:javascript
复制
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获得设置项时,我会得到这个错误。请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 21:30:05

我复制了您的问题,我认为您不能在两个或多个会话中使用ArrayMemcachedSessionAllocatorOne at a Time散列算法。

根据文档,ArrayMemcachedSessionAllocator类将会话定位为hash(key) mod sessions.size()

这个数字将是代码中Arraylist的索引。具体而言,这是有罪的:

代码语言:javascript
复制
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也是一个负值。

另一方面,fooOne_At_a_Time有一个正散列值,而模2仍然是一个正值!

备注:如果您有一个服务器(因为任何数字%1都是正的),该算法运行得非常好。

因此,我认为您不能在两个或更多服务器上使用ArrayMemcachedSessionAllocator类的哈希算法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20402213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档