java - xmemcached 设置错误 ArrayIndexOutOfBounds

标签 java memcached xmemcached

我将服务器添加到 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 获取设置的项目时,出现此错误。 请帮忙

最佳答案

我复制了您的问题,我认为您不能使用ArrayMemcachedSessionAllocatorOne at a Time 2 个或更多 session 的哈希算法。

根据文档 ArrayMemcachedSessionAllocator类将 session 定位为 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 个或更多服务器的类。

关于java - xmemcached 设置错误 ArrayIndexOutOfBounds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402213/

相关文章:

java - 片段着色器中的状态相关渲染

mysql - 你最喜欢的 Ruby on Rails 书籍是什么?为什么?

java - 这些 Xmemcached 错误消息是什么?

java - 如何使用xmemcached或spymemcached与memcached服务器建立持久连接

ruby-on-rails - 如何使用 Rails 进行扩展

java - Spring Boot 测试中出现奇怪的 UnsatisfiedDependencyExceptions

java - 找不到依赖项 'com.amazonaws'

Java 框架 war : Spring and Hibernate

performance - 缓存、文件系统或 Memcached 哪个更快/更好?