Java用のmemcachedクライアントである「spymemcached」を使います。
Grailsのversionは2.1.2です。
- 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]
- 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]
- 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]
- ファイルのコンパイルと実行
[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 ディレクトリーにコピーすることです。このサンプル・アプリケーションには memcached の Java クライアントである 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をたたかずにキャッシュを表示するという使い方です。
おわり。