最近ふと興味がわいて、NoSQLのことを調べてたりします。
NoSQL(Not only SQL)とはMySQLやPostgreSQLのような従来のRDBとは異なるデータの持ち方の概念(データモデル)でデータを管理するデータベースシステムのことです。
なぜわざわざRDBとは違うシステムが必要になるのかというと、RDBだけではうまく対応できないような場面や、RDBでない方が都合がよいケースが存在するためです。
例えば、有名なMastodonはNoSQLの一つであるRedisをプロセス間のデータ共有に使用していますが、これをもしRDBで置き換えたなら、おそらくリアルタイムに次々とデータが投稿されるMastodonでは追い付かなくなるでしょう。
Redisならインメモリにデータが保持されているので、このあたりの処理がRDBと比較して高速化できます。(ただし、NoSQLにはデータの整合性や、RDBのような複雑な条件での検索などが弱いため、この部分は逆にRDBで補うことになります。)
そんなRedisですが、具体的にどんな場合で利用すると効果的なのか、ちょっと調べてみました。
・複雑なデータを保持するキャッシュストレージとして使う
例えばWebsocketを使ったシステムをNode.jsとApache+PHPの組み合わせで構築した場合、Node.jsとApache(PHP)は別の環境で動作しているため、そのままではデータの共有ができません。
そこで、同じデータを参照できるようにするために、データの橋渡し役が必要になります。
RDBやファイルといった選択肢もありますが、ここにRedisを使うことで、高速かつある程度複雑な構造のデータも簡単に扱うことができるようです。
・キャッシュしたデータを(半)永久的に保持したい
RedisはMemcachedとよく比較されますが、Memcachedは再起動すれば値が消失してしまうのに対し、RedisはファイルとしてDBのデータを保持しておく仕組みもあるため、設定をしておけばRedisサービスやサーバーの再起動を行ってもデータを保持しておくことができます。
・Pub/Subを使った仕組みを実装したい。
メッセージのやり取りをする仕組みのモデルとして”Pub/Sub”というものがあるのですが、Redisではこのモデルにのっとった仕組みを標準で提供してくれるようです。
Pub/Subモデルを使用したシステムを作りたい場合は、最適な選択肢になるかもしれません。
このように、システムによっては従来にない便利な仕組みを提供してくれるRedisですが、注意しなければならないのはRedisが”インメモリDB”であるという点です。
メモリ(RAM)上ででデータの保持を行う仕組みのため、メモリの容量の限界を超えたデータの保存は行うことができません。(記事によってはRAM全容量の約半分以上は保存できない、という話も記載されています。)
そのため、万が一容量がいっぱいになってしまった場合は、書き込み失敗とするか、古いデータを削除する以外に方法がありません。
データを永続させられるとは言え、Redisに置いておく必要のなくなったデータは積極的に削除するか、完全に永続化が可能なRDBやファイルなどに移しておくなどの工夫が必要となりそうです。
実際のところ、RedisはRDBを置き換えるのではなく、DBとアプリケーションの間に+αで追加することで、より高速な動作を可能にする使い方に最も効果がありそうです。
調べていてかなり興味がわいてきたので、是非一度Redisを使ったシステムも作ってみたいですね。