ラベル memcached の投稿を表示しています。 すべての投稿を表示
ラベル memcached の投稿を表示しています。 すべての投稿を表示

2013年9月20日金曜日

JavaでTimeSpanクラス

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ではもっと楽に実装できるようになるのかしら。

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では今のところ問題なく動作しています。