1

サーバーに 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 からアイテム セットを取得しようとすると、このエラーが発生します。助けてください

4

1 に答える 1

0

ArrayMemcachedSessionAllocator問題を再現しましたが、One at a Timeハッシュ アルゴリズムを 2 つ以上のセッションで使用することはできないと思います。

ドキュメントによると、ArrayMemcachedSessionAllocatorクラスは Sessions を として検索します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 つの場合、このアルゴリズムは完全に正常に機能します (% 1 はすべて正であるため)。

ArrayMemcachedSessionAllocatorしたがって、このハッシュアルゴリズムを2 つ以上のサーバーのクラスで使用することはできないと思います。

于 2013-12-08T21:30:05.940 に答える