Grailsでmemcachedを使う

            Java用のmemcachedクライアントである「spymemcached」を使います。

Grailsのversionは2.1.2です。

  1. spymemcachedのインストール&コンパイル設定

grails-app/conf/BuildConfig.groovy

[groovy] repositories {

grailsPlugins()
grailsHome()
grailsCentral()

// 下記を追加
mavenRepo 'http://files.couchbase.com/maven2/'

}

dependencies {

// 下記を追加
compile 'spy:spymemcached:2.8.9'

} [/groovy]

  1. MemcachedServiceの作成

grails-app/services/MemcachedService.groovy

[groovy] import net.spy.memcached.AddrUtil import net.spy.memcached.MemcachedClient import org.springframework.beans.factory.InitializingBean

class MemcachedService implements InitializingBean {

static final Object NULL = "NULL"
def MemcachedClient memcachedClient

def void afterPropertiesSet() {
    memcachedClient = new MemcachedClient(AddrUtil.getAddresses("localhost:11211"))
}

def get(String key) {
    return memcachedClient.get(key)
}

def set(String key, Object value) {
    memcachedClient.set(key, 600, value)
}

def delete(String key) {
    memcachedClient.delete(key)
}

def clear() {
    memcachedClient.flush()
}

def update(key, function) {
    def value = function()
    if (value == null) value = NULL
    set(key, value)
    return value
}

def get(key, function) {
    def value = get(key)
    if (value == null) {
        value = update(key, function)
    }
    return (value == NULL) ? null : value;
}

} [/groovy]

  1. MemcachedServiceの利用

[groovy] class TopController {

def memcachedService

def index() {

    def memcachedKey = 'top'

    def data = memcachedService.get(memcachedKey)

    if (data) {
    }
    else {

        data = NULL

        // dataをとる処理

        memcachedService.set(memcachedKey, data)

    }

    [
        data: data
    ]

}

} [/groovy]

  1. ファイルのコンパイルと実行

[bash] grails compile --refresh-dependencies grails run-app [/bash]

この手順はほとんど下記にのってます。 http://www.ibm.com/developerworks/jp/java/library/j-memcached2.html

memcached クライアントを Grails アプリケーションに追加する際に最初に行わなければならない作業は、該当する jar ファイルをダウンロードして、そのファイルを contactmanager/lib ディレクトリーにコピーすることです。このサンプル・アプリケーションには memcachedJava クライアントである Spymemcached を使用しているので、この JAR をダウンロードしてください。」

僕はなぜかこの部分がうまくいかず、libにいれても上手くいきませんでした。 ※import net.spy.memcached.AddrUtilがNot foundだとエラーでてコンパイルできない症状。

ということで、Stack Overflowで教えてもらいました。 http://stackoverflow.com/questions/14049614/how-to-use-memcached-in-grails

で、Grailsのテストアプリに組み込んだら成功したのでこれでいけるみたいです。

↓テストアプリ http://service.tnnsst35.me/weddingram/

ブラウザを開くたびにInstagram APIをたたいて写真をとってくる処理をする部分に使って、キャッシュデータがあればAPIをたたかずにキャッシュを表示するという使い方です。

おわり。