2013年4月19日金曜日

Object::Containerって何だ?

このへん見とくのが分かりやすそう。
http://perl-users.jp/articles/advent-calendar/2011/casual/10
http://search.cpan.org/~typester/Object-Container-0.08/lib/Object/Container/ja.pod

珍しくCPANの説明も比較的わかりやすい。
どうやらいくつものモジュールをいちいちnewするのめんどいしコストかかるじゃん、
そうだ最初に一度にnewしといてキャッシュしとけば便利じゃね?というもののようだ。
newしたもの、つまりインスタンスを大量に格納しておくモジュールだから「コンテナ」ということか。

package MyContainer;
use Object::Container '-base';
my @object = qw/

 foo
 bar

/;
for (@object) {
 register($_);
}

みたいに予めインスタンスをキャッシュするモジュールを作っておいて
他のモジュールで

package Hoge;
use MyContainer;
my $object_foo = MyContainer->get('foo');
my $object_bar = MyContainer->get('bar');

みたいにしてあれこれやればよいということだと思う。


2013年4月18日木曜日

Cometのまとめ

http://codezine.jp/article/detail/733

探した限り、一番わかり易い説明が上記。
Cometとは一言で言うとサーバー側からリアルタイムにレスポンスを受け取るための技術
で、普通はそんなことできないじゃん、だってこっちがリクエストを投げない限りサーバーは
レスポンスを返さないでしょ?という疑問に対し丁寧に説明をしている。

チャットツールを例に取り、リアルタイムでレスポンスを受け取る方法をいくつか解説している。

1:F5連打法。F5連打すればサーバーに新たなメッセージが届いた時すぐサーバーのデータを
取得できるね、でもF5連打するの大変じゃね?

2.ブラウザが定期的にリロードする方法。自動化されてるけど、間隔が短すぎるとリロードの
たびに何もできない時間が生じてうざいよね?

3.Ajaxを使った方法。ページ全読み込みじゃないから2の方法よりはましだね。でも更新間隔
を長くすると新着メッセージの反映が遅れるね。

4.Cometを使った方法。じゃあこっちがリクエストを投げた時に新着メッセージが届くまで
なんもレスポンスを返さずに待ち状態にしといて、メッセージが届いた瞬間にレスを返せば
よくね?というこっちが投げたボールをサーバーがずっと持っとくという画期的アイデアに
よって、リアルタイムレスポンスを実現したとさ。めでたしめでたし。

という感じ。

redisのまとめ

http://gihyo.jp/dev/feature/01/redis

メモリ内にデータを格納するキーバリューストアでNoSQLの一種。
メモリ内にデータを蓄えるので高速に動く。
memcachedとの違いは、memcachedはGETやSETなどシンプルな操作に特化している
のに対して、redisはいろいろと複雑な操作ができること。
memcachedは古いデータから順に削除するが、redisは明示的に削除をするか、timeoutを
設定しない限り削除されない
永続化の機能を持っている。すなわち、オンメモリのデータストアの欠点である、クラッシュ
したらデータが消えてしまうという欠点をカバーしていて、定期的にデータダンプをする機能
がある。

キーバリューストアのバリューの部分にデータ構造を格納することができる。
リスト、セット、ソート済みのセット、ハッシュなど。

memcachedは特定の番組をみた数万人のユーザーIDのリストなどの巨大なデータ構造の
データを扱うことが難しい。また、データの永続化ができないので、消えた時のために
永続化する仕組み(MySQLなど)を用意する必要があった。


文字列データの取得とセット、削除
取得:GET キー名
セット:SET キー名 値
削除:DEL キー名

数値型のデータのインクリメント、デクリメント
インクリメント:INCR キー名
デクリメント:DECR キー名

データのタイムアウト値の設定
タイムアウト設定:EXPIRE キー名 タイムアウト秒数

複数コマンドのアトミック実行(SQLのトランザクションみたいなもの、コマンドは全部成功
したか、全部失敗したかの2種類しか存在しないようにする)
MULTI
GETやSETなど、redisコマンドを複数記載
EXEC
でMULTIとEXECの間のコマンドをアトミックに実行
※どうやらロールバックはないので、途中で失敗して、どちらかのコマンドだけが実行されて
しまうということも発生するようだ。

まとめると、redisは
MySQLと比較するとデータアクセスは速いが容量は少ない
memcachedと比較すると値にハッシュなどデータ構造を格納することができ、メモリが
クラッシュしても大丈夫なように永続化の機能も持っている

という感じ。












2013年4月16日火曜日

memcachedのまとめ

キーバリューストア(KVS)という、ハッシュのようにキーと値のセットでメモリ上にデータを
格納できるソフトウェア。長所はメモリ上にデータを保存しているので

値の格納は下記のようにして行う。

my $add = $memcached->add( 'キー', '値', '期限' );
my $replace = $memcached->replace( 'キー', '値', '期限' );
my $set = $memcached->set( 'キー', '値', '期限' );

値の取り出しは下記のようにして行う。
my $val = $memcached->get('キー');
my $val = $memcached->get_multi('キー1', 'キー2', 'キー3', 'キー4', 'キー5');

詳しくは下記を参照。


Q4Mのまとめ

Q4MとはMySQLを使ったキューのこと。ある処理を非同期で順番に処理したいときに使う。


使い方はQ4Mをインストールして好きなテーブルを設定したら、
insert文でキューを挿入し、select queue_wait(テーブル名)でキューを取り出し、
該当キューの処理が終わったらselect queue_end(テーブル名)で該当キューを終了させる。

詳細な使い方は下記のページを参照。
http://gihyo.jp/dev/serial/01/perl-hackers-hub/001003?page=1

インストール方法はこれ。
http://blog.nomadscafe.jp/2011/12/q4m---mysql-casual-advent-calendar-2011.html