memcached, Redis 何をどう使う
情けないことに、最近までRedisについてちゃんと知る(知ろうとする)機会がなかった。
自分が開発しているアプリケーション上でこれまで使ったことがないはずはないと思うのだけど、Redis? あーあれ memcached と同じようなやつなのか〜完〜 で閉じててそれ以上深く知ろうとしなかった。
まとまってる記事は山ほどあるのだけど共にKVSである memcached と Redis について改めて特徴と比較。
そもそもの話
この2つはNoSQL(Not only SQL)と呼ばれるもの
memcached
- データのレプリケーションが行えない
- GET/SET等のシンプルな操作が可能で、ディスクへの書き込みは行わない
- Expired(有効期限)を設定可能
- が、メモリが指定された容量に達すると、LRU(Least Recently Used)に基づいて利用されないキャッシュから古い順にデータが自動的に削除される
- データはメモリストレージに貯められる=全てメモリ上にのみ存在するのでDBやOSの再起動を行った際に全てのデータが削除される
- つまり障害発生時に吹っ飛ぶ可能性高い
- 永続化についてあまり考慮されてないのは memcached 自体キャッシュのためのサーバとして設計されているから
- 文字列型しか扱えない
Redis
- データのレプリケーションが行える
- ディスクへの読み書きが可能
- Expired(有効期限)を設定しない限りは削除されない(古いデータを自動削除されない)
- データの永続化が可能
Redis でのデータ管理方法は以下の3つがあるが、下の2つで Redis を再起動してもディスクからメモリにデータを読み込み直すのでデータの永続化が図れるというもの。- メモリでデータを管理する
- 特定のタイミングでデータをディスクに保存する(snapshot機能)
- 書き込み操作を随時ディスクに保存する
- 文字列/セット/リスト/ハッシュ、幅広く複雑な種類のデータが扱える
- master/slave構成
ところでKVSは、
メモリ上にデータを格納するもの:揮発性KVS ディスク上にデータを格納するもの:永続性KVS
と分類される。
memcached と Redis は両方揮発性があるとしてKVSに分類されるが、Redis はディスク上にバックアップが可能でもあるので揮発性&永続性を兼ね備えてるといえる模様。
比較して
だいたい memcached ができることは Redis もできるよという印象だが、
ユースケースや規模が事前にきっちり把握できるなら memcached の方がパフォーマンス的に優れている場合もあるとのこと。
メモリでキャッシュするデータの特性によって使い分けるのが大事
といった感じ?
なぜ Redis ちゃんと調べた記憶無いんだろうと思い記憶を掘り起こしてみると、
今までよく扱ってたフレームワーク(PHP)がデフォルトでは Session を Cookie に書き込みにいく構成になっており、 そのFWでドライバは Cookie, File, DB, memcached, Redis を指定することができるけどそこで memcached を設定してたことが多かったような気がするというのがあった。
あとそういやPHPは Session はデフォルトでは /var/tmp/***
の一時ディレクトリにファイル保存してた。 (デフォルトがそうとはいえ負荷を考えるときにはKVSを検討しなきゃいけないけど)