2017-09-05 日報

めっちゃコード書いてた。


今日調べたこと

[Redis] pipelining と transaction の違い

stack overflowに超分かりやすい回答があった。

パイプライン処理は、主にネットワークの最適化です。これは基本的に、クライアントが一連のコマンドをバッファリングし、それらを一度にサーバーに送ることを意味します。これらのコマンドは、トランザクション内で実行される保証はありません。ここでの利点は、すべてのコマンドのネットワークラウンドトリップ時間を節約することです。
Redisはシングルスレッドなので、個々のコマンドは常にアトミックですが、異なるクライアントからの2つのコマンドは、例えば、それらの間で交互に実行できます。
しかし、Multi / execは、他のクライアントがmulti / execシーケンスのコマンド間でコマンドを実行していないことを保証します。
pipelining vs transaction in redis - Stack Overflow

[Redis] Jedisでの Pipelineの使い方

AdvancedUsage · xetorthio/jedis Wiki

場合によっては、さまざまなコマンドを送信する必要があります。素朴なやり方よりも優れたパフォーマンスを発揮する、非常にクールな方法は、パイプライニングを使用することです。こうすることで、応答を待たずにコマンドを送信することができ、実際には最後に応答を読むことができます。

Pipeline p = jedis.pipelined();
p.set("fool", "bar"); 
p.zadd("foo", 1, "barowitch");  p.zadd("foo", 0, "barinsky"); p.zadd("foo", 0, "barikoviev");
Response<String> pipeString = p.get("fool");
Response<Set<String>> sose = p.zrange("foo", 0, -1);
p.sync(); 

int soseSize = sose.get().size();
Set<String> setBack = sose.get();

Pipeline#sync()のタイミングでコマンドが一気に送信される。
個々のコマンドの結果は Response<T> に格納されて、sync() の後に参照できる。

[Java] [Jackson] リストのJSON文字列をparseする

JacksonでJSONをstringify/parseする場合、
List<T> なリストを変換すると以下になる。
# 読みやすいように改行

[
  {"name":"山崎 康晃","number":19},
  {"name":"筒香 嘉智","number":25},
  {"name":"梶谷 隆幸","number":3}
]

このJSONを逆に List<T> に戻そうとするとちょっと面倒くさい。
List<T>.class みたいなことが出来ない (Java言語のClassクラスが持つちょっと不思議な性質について - 達人プログラマーを目指して) ので Pojoの時みたいに簡単に parse できない。

いくつか解決方法はありそうだけど、今回は別に List<T> である必要はないので T[] を返すことにした。

参考: java - How to use Jackson to deserialise an array of objects - Stack Overflow

コメント

このブログの人気の投稿

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

蛍光灯フリッカー現象 (ちらつき) の対策

[node.js] CP932のテキストを読み込む