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"という文字列が得られる }
追う気もしないので適当に自前で書いてみましたとさ。