JavaでKestrelクライアントsimple-kestrel-clientを書いてみた。

hogelog/simple-kestrel-client · GitHub

spymemcachedはKestrelで扱うとなんかどうもうまくない。xmemcachedはKestrel対応もしているとは書いてあるけど、なんだかどうもやっぱりpeekとかtimeoutとかを設定するとちゃんと動かない。とりあえず適当に書きなぐってみた。deleteとか他にも色々書いてないし色々適当。

こんな感じ。普通に使える。memcachedクライアントをkestrelクライアントとして使うのは悪手なのかなー。

public class SimpleKestrelClientTest {
    @Test
    public void set_peek_get_peektimeout_gettimeout() throws Exception {
        Socket socket = new Socket("127.0.0.1", 22133);
        SimpleKestrelClient client = new SimpleKestrelClient(socket);

        client.set("hoge", "hoge\r\nhoge");

        assertThat(client.peek("hoge"), is("hoge\r\nhoge"));
        assertThat(client.get("hoge"), is("hoge\r\nhoge"));
        assertThat(client.get("hoge"), is(nullValue()));

        new Thread(){
            @Override
            public void run() {
                try {
                    Socket socket = new Socket("127.0.0.1", 22133);
                    SimpleKestrelClient client = new SimpleKestrelClient(socket);
                    Thread.sleep(1000);
                    client.set("hoge", "hogefuga");
                    Thread.sleep(1000);
                    client.set("hoge", "hogemoge");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        assertThat(client.peek("hoge", 5000), is("hogefuga"));
        assertThat(client.get("hoge"), is("hogefuga"));
        assertThat(client.get("hoge"), is(nullValue()));
        assertThat(client.get("hoge", 5000), is("hogemoge"));
    }
}

xmemcachedでkestrelを叩くとなんか変な件

割とわけのわからない挙動をする。

    @Test
    public void xmemcached_set_peek_get_peektimeout_gettimeout() throws Exception {
        final XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:22133"));
        builder.setCommandFactory(new KestrelCommandFactory());
        SerializingTranscoder transcoder = new SerializingTranscoder();
        transcoder.setCharset("UTF-8");
        builder.setTranscoder(transcoder);

        final MemcachedClient client = builder.build();
        client.setOpTimeout(5000);

        client.set("moge", 0, "aaaaa");
        client.set("hoge", 0, "hoge\r\nhoge");

        assertThat(String.class.cast(client.get("hoge/peek")), is("hoge\r\nhoge"));
        assertThat(String.class.cast(client.get("hoge")), is("hoge\r\nhoge"));
        assertThat(String.class.cast(client.get("hoge")), is(nullValue()));

        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    client.set("hoge", 0, "hogefuga");
                    Thread.sleep(1000);
                    client.get("moge/peek");
                    client.set("hoge", 0, "hogemoge");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        assertThat(String.class.cast(client.get("hoge/peek/t=5000")), is("hogefuga"));
        assertThat(String.class.cast(client.get("hoge")), is("hogefuga"));
        assertThat(String.class.cast(client.get("hoge")), is(nullValue()));
        assertThat(String.class.cast(client.get("hoge/t=5000")), is("hogemoge")); // 何故かこここでmogeにセットした"aaaaa"という文字列が得られる
    }

追う気もしないので適当に自前で書いてみましたとさ。

test