ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

Enyim Memcached は Mono1.9.1上では使えない

Sunday, 25 May 2008 12:21 by sabro

ずっと、Windows環境で開発してるんだけど、本番ではLinux上のmod-mono-server上で稼働させる予定です。なので、1回は試しとかないとまずいよねということで、デプロイしてみたら、Enyim Memcachedがコケました orz

スタックトレースは以下↓

System.TypeInitializationException: An exception was thrown by the type initializer for CreamonModel.Utility.MemCachedUtil ---> System.TypeInitializationException: An exception was thrown by the type initializer for Enyim.Caching.Memcached.ServerPool ---> System.NotImplementedException: The requested feature is not implemented.
at System.Configuration.ConfigurationElement.get_EvaluationContext () [0x00000]
at Enyim.Caching.Configuration.MemcachedClientSection.PostDeserialize () [0x00000]
at System.Configuration.ConfigurationElement.DeserializeElement (System.Xml.XmlReader reader, Boolean serializeCollectionKey) [0x00000]
at System.Configuration.ConfigurationSection.DeserializeSection (System.Xml.XmlReader reader) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.ConfigurationSectionCollection.get_Item (System.String name) [0x00000]
at System.Configuration.Configuration.GetSection (System.String path) [0x00000]
at System.Web.Configuration.WebConfigurationManager.GetSection (System.String sectionName, System.String path) [0x00000]
at System.Web.Configuration.WebConfigurationManager.GetSection (System.String sectionName) [0x00000]
at System.Web.Configuration.HttpConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000]
at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000]
at Enyim.Caching.Memcached.ServerPool..cctor () [0x00000] --- End of inner exception stack trace ---

 

2行目を見ると、System.Configuration.ConfigurationElementクラスの、EvaluationContextプロパティをGetするところで落ちてるみたいなので、 最新の、Mono1.9.1のソースで該当箇所を確認すると・・・。

  [MonoTODO]
protected ContextInformation EvaluationContext {
get {
throw new NotImplementedException ();
}
}

 


ちょっ Σ( ̄□  ̄||

なんか例外投げてました orz う~ん、Enyim Memcachedは、.NETのMemcachedClientで唯一ジェネリック対応メソッドがあって使いやすいのになぁ。 別のライブラリを使うか、Monoがちゃんと実装されるのを待つか。うーん困った。

Tags:   ,
Categories:   .NET
Actions:   Permalink | Comments (40) | Comment RSSRSS comment feed

memcachedのIncrementでハマる

Monday, 19 May 2008 14:32 by sabro

memcachedにIncrementっていうメソッドがあって、キャッシュ上の数値を排他的にインクリメント出来る。 つまり、他のクライアントに更新が上書きされることがないので、ページビューのカウントとかには、かなり使えるめそっど♪

自分も、ページビューのインクリメントに使おうとしてたんだけど、おもっきりハマッてしまった。 数値の1をキャッシュに格納した後に、Incrementをすると、なぜか値が、538976305と一気に飛んでしまう。 2回見ただけで、5億ページビュー達成だ \(^o^)/

いろいろ試したけどダメで、どうしようかと思ったんだけど。 Enyim Memcachedのソースをダウンロードして、Incrementメソッドのコメントを見ると 「The item must be inserted into the cache before it can be changed. The item must be inserted as a T:System.String.」 って書いてあった。

ないわー。インクリメントする値なのに、初期値を文字列で登録しないといけないらしい ( ̄□  ̄|| 実際に、初期値を「1」でなく「"1"」で登録したら、無事インクリメント出来てしまった。

こんな変な仕様が標準なんだろうか。Enyim Memcachedがおかしな実装してるだけかなあ。

Tags:  
Categories:   .NET
Actions:   Permalink | Comments (46) | Comment RSSRSS comment feed

memcachedをソースから入れ直した

Saturday, 17 May 2008 14:48 by sabro

Enyim Memcachedに、複数のキャッシュを一気に取得する関数があったので使ってみたら、サポートされてませんっていうエラーがでた。

よくよく調べてみると、「append、prepend、gets、cas」の4つのコマンドは、バージョン1.2.4から追加されたみたいで、CentOS5のyumでインストールされる1.2.2では、getsが使えないもよう。

仕方ないので、ソースからインストールすることに。本家サイトからソースをダウンロードして、解凍後、configureするとエラーが出た。

checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/

If it's already installed, specify its path using --with-libevent=/dir/
libeventっていうライブラリがないと怒られてる。--with-libeventっていう引数でディレクトリ指定しても効果なし。yumでインストールしてあるはずなんだけどなあ・・・。試しにlibeventも最新版をソースから入れてみる。
tar zxvf libevent-1.4.4-stable.tar.gz
cd libevent-1.4.4-stable
./configure
make
make install
/usr/local/libにインストールされたようです。つづいて、memcached再挑戦。
tar zxvf memcached-1.2.5.tar.gz
cd memcached-1.2.5
./configure
make
make install
今度は無事に入りました。さて、/usr/local/binにmemcached本体があるので、早速起動してみたところ、なぜかまた、libeventが見つからないというエラーが出てます( ̄□  ̄||
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
以下の環境変数が必要だったとか。
export LD_LIBRARY_PATH=/usr/local/lib/

これで無事、getsも使えるようになりました。

追記:
最後の環境変数は、/etc/ld.so.confに/usr/local/lib/を追加して、ldconfigで反映させるだけでよかったみたいです。

Tags:   ,
Categories:   Linux
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed

.NETからmemcachedを使う

Saturday, 17 May 2008 02:41 by sabro

SecondLife向けのWebサービスなど立てても、1日数人しか来ない気もするが、自分の勉強も兼ねて、memcachedで負荷軽減の仕組みとか作ってみる。

memcachedの.Net向けドライバは以下の3つが公式サイトで紹介されていた。

  • .NET memcached client library・・・古くからある感じ
  • Enyim Memcached・・・かなり新しい5月にリリースされてる
  • BeIT Memcached・・・こちらは3月にリリースされてる

とりあえず、一番最近リリースされてて機能も豊富そうな、Enyim Memcachedを使うことに決定。設定は以下のような感じで、web.configのconfigurationタグ直下に書いておけばいいみたい。

  <enyim.com>
<memcached>
<servers>
<add address="192.168.1.1" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
</enyim.com>

コードは至ってシンプル♪

// Memcached Clientのインスタンス作成
MemcachedClient mc = new MemcachedClient();

// オブジェクト格納(StoreMode.Setで上書き。"value"文字列を5分キャッシュ)
mc.Store(StoreMode.Set, "key", "value", new TimeSpan(0, 5, 0));

// オブジェクト取出(ジェネリック対応メソッドがある!)
string str = mc.Get<string>("key");

あとは、DBからデータを取得するとき、まずキャッシュを見るようにして、データ更新時にはキャッシュを消すようにすればいいだけ。

これで充実したキャッシュライフが送れること請け合いですな( ̄∇ ̄)

Tags:  
Categories:   .NET
Actions:   Permalink | Comments (83) | Comment RSSRSS comment feed