えんじん

えんじん

バイクとお金とITと

データはディスクストレージでなくメモリに持つ時代?インメモリDB「Redis」について調べてみた!

f:id:corbo93:20170827203540j:plain

今回はこてこての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で多く使われるストレージエンジンInnoDBmemcachedプロトコルで高速アクセスさせるための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

うりゃ!

なんか出てきた(‘ω’)

メモリをイメージしてるのかな?

f:id:corbo93:20170827202353p:plain

これが出れば起動はOKです。

subscribeで受取準備

別ウィンドウを立ち上げてRedisクライアントを起動しておきます。

コマンドはこれ。

redis-cli

f:id:corbo93:20170827202456p:plain

こんな感じで

publishで発信

またまた別ウィンドウ、これで3つ目。

こっちからもRedisクライアントを起動

redis-cli

以下のコマンドでpubります。

これでテキトーなメッセージを送ってみます。

f:id:corbo93:20170827203053p:plain

するとsubcribeしているプロセスに送信されてる

subscribe [チャンネル名]

f:id:corbo93:20170827203021p:plain

おっ、来てる。

まとめ

一旦は実際に軽くRedisの機能をつかってみるところまで紹介してみました。

pub/subの機能ですが、まだどんな感じで実装していくのかはわかんないですが、

サーバサイドに非同期処理をさせるようなことが要求されるので、Node.jsとかで書いていく感じになるんだそう。

phpだけでやるのは厳しいっぽくちょっと萎えてる。

だってjavascript書けないから。。。(汗)

まだまだ新興もののシステムなので今後いろんな場面で活躍していくのが楽しみですね(#^^#)