こんにちは。くろしばです。
今回はこてこてのWEB談義。
web業界に速度が求められるようになり、データの管理場所にも注目が集まっています。
紹介するのは、従来のデータベースとは少し異なるインメモリDBのRedis。
メモリに保持したデータは高速に取り出せる!
スポンサーリンク
概要
RedisというのはインメモリDBの一種です。
Remote Dictionary Server略してRedis。
Dictionnaryっていう単語はプログラムミング言語の世界では連想配列、ハッシュ、などと表されることもありますが、
要は一意のkeyを渡すとvalueが返ってくるといった仕組みになっていることを表してるらしいね。
ほんとややこしい。1個にしろや(; ・`д・´)
インメモリDBっていうのはストレージではなくメモリにデータを保持するデータベースであることを意味します。
メモリはCPUから直接アクセスすることができるのでストレージにデータを保持している一般的なRDBよりも高速にアクセスすることができます。
Redisのメリット、デメリット
メリット
インメモリDBとしてのメリットは前述したように、アクセスが高速になるというメリットがあります。
またデータ型のサポートをしており、単なるKVS(key-value store)以上の機能を持ったインメモリDBと言えます。
デメリット
メモリにデータを保持している = 揮発性のデータとなるため、電源を切ることでデータは失われてしまします。
Redisにおいては揮発性のデータを永続的に保持するために、スナップショットをとれば、データを永続的に保持することができます。
KVSとして他にどんなシステムを検討するか
memcached
文字列のみしか扱えません。
あとはキャッシュ削除の仕組みが、多少複雑です。
消したはずのデータがいつまでも出てきてしまう、といった現象も対面したことがあります。
memcachedはメモリ開放を行わずinvisibleにするような処理をするようでその辺も関係しているのかな。
repcached
memcachedにレプリケーション機能を持たせたもの。
これでもいんじゃね?と思ったけど
データ型の対応がRedisの方がすぐれてるっぽいね。
Apache Cassandra
サービス運用していくと、データを呼び出すのに、そこそこ処理の重いAPI軍が必要になってきます。
(僕が経験したケースでは、ですが。。)
json対応もしているKVSのDBとして、そこそこ速い、そこそこ便利なのかもしれません。
TokyoTyrant
基本的にvalueとして文字列しか格納することができません。
MySQL InnoDB Memcached
MySQLで多く使われるストレージエンジンInnoDBにmemcachedプロトコルで高速アクセスさせるためのMySQLのプラグインのこと。
既存のMySQLのシステムに拡張を行う形のため、複数のコンテンツでDBを共有していたりすると、ちょっと影響が怖いかもね。
また事例として、InnoDBからデータをgetするときに、予期せぬ形で取得され、クラッシュ多発。
その結果使い物にならない、なんて事例もあるみたいです。
そもそもストレージにデータを持っている時点で、RDBとのすみわけ的な観点から行くと中途半端な感じ?
どんなデータをRedisに持たせるか
メモリにデータを保持することで、以下のような特性が生まれます。
・ストレージに比べメモリは高価なため、容量が小さなデータの管理
・揮発性という性質上、失った際に致命的でないデータの管理
Redisの便利機能、PUB/SUB
pub:publish(発行)
sub:subcribe(購読)
使い方
この例ではMacにRedisをインストールして使っています。
カンタンに手順をご紹介します(#^^#)
brewは使える環境にあることを前提にしていますので、ご注意を!
RedisをMacにインストール
brewがインストールされている環境であればこれだけです。
brew search redis
sudo brew install redis
brewのインストール手順は省きます、さーせん。
Redisを立ち上げる
これ以降の手順はターミナルのウィンドウを分けて、別のプロセスで実施するようにしてください。
redis-server
うりゃ!
なんか出てきた('ω')
メモリをイメージしてるのかな?
これが出れば起動はOKです。
subscribeで受取準備
別ウィンドウを立ち上げてRedisクライアントを起動しておきます。
コマンドはこれ。
redis-cli
こんな感じで
publishで発信
またまた別ウィンドウ、これで3つ目。
こっちからもRedisクライアントを起動
redis-cli
以下のコマンドでpubります。
これでテキトーなメッセージを送ってみます。
するとsubcribeしているプロセスに送信されてる
subscribe [チャンネル名]
おっ、来てる。
まとめ
一旦は実際に軽くRedisの機能をつかってみるところまで紹介してみました。
pub/subの機能ですが、まだどんな感じで実装していくのかはわかんないですが、
サーバサイドに非同期処理をさせるようなことが要求されるので、Node.jsとかで書いていく感じになるんだそう。
phpだけでやるのは厳しいっぽくちょっと萎えてる。
だってjavascript書けないから。。。(汗)
まだまだ新興もののシステムなので今後いろんな場面で活躍していくのが楽しみですね(#^^#)