TimeSpanクラスとはなんぞやというと
Date と Dateを比較した差分を保持するという単純なクラスです#
Calendarクラス使えばいいと思われますが
static final な fieldの定義とか結構めんどくさい
TimeSpanクラスで7日の差分を定義すると
public static final TimeSpan TIMESPAN = TimeSpan.Days(7);
で現在と差分を足したDateを求めるには、
Date date = TIMESPAN.getDate(new Date());
とすればいい。
何に利用するかというと主に
Memcachedに渡すExpireの 定義とかです。
Memcached.get(key, new Memgetable<String>() {
public String get() {
return value;
}
}, TIMESPAN.getDate(new Date()));
こんな風に記述ができます。
TimeSpan.java : stackoverflowを参照したような…参照元は失念
import java.util.Date;
import org.apache.commons.lang3.time.DateUtils;
public class TimeSpan {
private int millis;
public TimeSpan(int millis) {
this.millis = millis;
}
public TimeSpan(Date source, Date dest){
millis = (int)(dest.getTime() - source.getTime());
}
private TimeSpan() {
}
public int getDays() {
return this.getTotalHours() / 24;
}
public int getTotalHours() {
return this.getTotalMinutes() / 60;
}
public int getTotalMinutes() {
return this.getTotalSeconds() / 60;
}
public int getTotalSeconds() {
return (int) (this.millis / 1000);
}
public long getTotalMillis() {
return this.millis;
}
public TimeSpan addDays(int days) {
return addHours(days * 24);
}
public TimeSpan addHours(int hours) {
return addMinutes(hours * 60);
}
public TimeSpan addMinutes(int minutes) {
return addSeconds(minutes * 60);
}
public TimeSpan addSeconds(int seconds) {
return addMillis(seconds * 1000);
}
public TimeSpan addMillis(int millis) {
this.millis += millis;
return this;
}
public Date getDate() {
return new Date(this.millis);
}
public Date getDate(Date currentDate) {
return DateUtils.addMilliseconds(currentDate, millis);
}
public static TimeSpan Days(int days) {
return new TimeSpan().addDays(days);
}
public static TimeSpan Hours(int hours) {
return new TimeSpan().addHours(hours);
}
public static TimeSpan Minutes(int minutes) {
return new TimeSpan().addMinutes(minutes);
}
public static TimeSpan Seconds(int seconds) {
return new TimeSpan().addSeconds(seconds);
}
public static TimeSpan Millis(int millis){
return new TimeSpan(millis);
}
public static TimeSpan Span(Date source, Date dest){
return new TimeSpan((int)(dest.getTime() - source.getTime()));
}
}
TODO:TimeSpan同士の比較
追記
2014/01/23 Java 8でのDurationによる代替方法→ここ
2012年12月9日日曜日
java でのmemcached ラッパー
Javaでmemcachedを利用する際に、
1.キーからオブジェクトget
2.オブジェクトがnullならデータ取得
3.2で取得したデータをmemcachedにset
というのは割りとよくある一連の実装だと思います。
前職でC#を使っているときはdelegate(ラムダ式)を使って
1つのメソッドで一連の処理を実装していました。
Javaでも同じように実装してみます。
Delegateはこんなかんじでいいのかな…
Delegate interfaceを定義、そのgetメソッドから取得するように。
public class Memcached {
protected static MemCachedClient mcc = new MemCachedClient();
static {
SockIOPool pool = SockIOPool.getInstance();
//設定
pool.initialize();
}
public static <T> T get(String key, Memgetable<T> delegate, Date expire){
Object ret = null;
ret = mcc.get(key);
if (ret != null) return ret;
ret = (T) delegate.get();
if (ret == null) return null;
mcc.set(key, ret, expire);
return ret;
}
public interface Memgetable<T> {
public T get();
}
}
呼び出しは、
String key = "test_key";
final String value = "test_value";
Memcached.get(key, new Memgetable<String>() {
public String get() {
return value;
}
}, new Date());
こんなかんじで、一行で出来ます。
Delegate interfaceにgetメソッドを定義し値がなければメソッドから値を取得します。
ラムダ式周りはC#が素晴らしすぎてJavaの非力さが露呈してしまう。。
Java 8ではもっと楽に実装できるようになるのかしら。
1.キーからオブジェクトget
2.オブジェクトがnullならデータ取得
3.2で取得したデータをmemcachedにset
というのは割りとよくある一連の実装だと思います。
前職でC#を使っているときはdelegate(ラムダ式)を使って
1つのメソッドで一連の処理を実装していました。
Javaでも同じように実装してみます。
Delegateはこんなかんじでいいのかな…
Delegate interfaceを定義、そのgetメソッドから取得するように。
public class Memcached {
protected static MemCachedClient mcc = new MemCachedClient();
static {
SockIOPool pool = SockIOPool.getInstance();
//設定
pool.initialize();
}
public static <T> T get(String key, Memgetable<T> delegate, Date expire){
Object ret = null;
ret = mcc.get(key);
if (ret != null) return ret;
ret = (T) delegate.get();
if (ret == null) return null;
mcc.set(key, ret, expire);
return ret;
}
public interface Memgetable<T> {
public T get();
}
}
呼び出しは、
String key = "test_key";
final String value = "test_value";
Memcached.get(key, new Memgetable<String>() {
public String get() {
return value;
}
}, new Date());
こんなかんじで、一行で出来ます。
Delegate interfaceにgetメソッドを定義し値がなければメソッドから値を取得します。
ラムダ式周りはC#が素晴らしすぎてJavaの非力さが露呈してしまう。。
Java 8ではもっと楽に実装できるようになるのかしら。
2012年12月8日土曜日
memcached for Windows 8 x64
Windows 8 x64 で memcachedをインストールする方法。
開発環境でmemcachedが必要だったのでインストールしようとしましたが、
ここにあるようなバイナリではサービスの追加に失敗して動きませんでした。
>memcached -d install
のコマンドで失敗します。(もしかして、管理者で実行しなかったからか…
のでもう一つの方法、CouchbaseのMembaseをインストールして
memcached モードで利用します。
ダウンロードはここの下の方から
インストールする際に、Bucket Setting 画面で Bucket Type : Memcached を選択
すればインストールはOKです。
では確認、
>telnet localhost 11211
>stats
で反応があれば確認完了です。
Memcached-Java-Clientでは今のところ問題なく動作しています。
開発環境でmemcachedが必要だったのでインストールしようとしましたが、
ここにあるようなバイナリではサービスの追加に失敗して動きませんでした。
>memcached -d install
のコマンドで失敗します。(もしかして、管理者で実行しなかったからか…
のでもう一つの方法、CouchbaseのMembaseをインストールして
memcached モードで利用します。
ダウンロードはここの下の方から
インストールする際に、Bucket Setting 画面で Bucket Type : Memcached を選択
すればインストールはOKです。
では確認、
>telnet localhost 11211
>stats
で反応があれば確認完了です。
Memcached-Java-Clientでは今のところ問題なく動作しています。
登録:
投稿 (Atom)