Webアプリケーションのパフォーマンスを向上しようとするとき、インメモリDBを導入することで解決できることがあります。 RedisはインメモリDBのひとつですが、単なるKVSではなく、永続性やデータ型のサポートといった特徴があり、Webアプリケーションの開発と親和性が高いといえます。

この記事では、RDBの利用で完結しているような、Redisを使ったことがない人でもその基礎が分かるよう、Redisの基本的なことについてまとめてみました。

Redisとは

RedisはインメモリDBのひとつで、その名のとおりメモリ上にデータを保存するタイプのデータベースです。 メモリはCPUから直接アクセスできるため、(RDBなどの)ストレージにデータを保存するオンディスクDBに比べ、とても高速に動作します。

オンディスクDBはストレージにSSD(不揮発性メモリ)を採用することでHDDに比べ高速に処理させることができますが、SSDは二次記憶装置であり、CPUから直接アクセスできる訳ではありません。 レスポンスが重要な場面では、未だインメモリDBが有用であるといえます。

一方で、インメモリDBは揮発性メモリにデータを格納するので、電源を切るとデータを失ってしまいます。 スナップショットによる復元などに対応しているものもありますが、完全な永続性の担保は難しくなっています。

Redisの特徴

Redisには、他のインメモリDB(memcachedなど)と比較すると、次のような特徴があります。

まず、一定期間ごとなどの条件でスナップショットをとり、再起動時にメモリ上に展開することでデータを永続化することができます。 高速に読み書きができるというメリットを享受しながら、データを永続化することができるのです。

また、単純なKVSではなく、文字列やハッシュ、セットといったさまざまデータ型があります。 こういった型のサポートはWebアプリケーションを開発する上でとても便利な機能です。

データ型を利用することで、たとえばソートやランキングといった機能を容易に実現することができます。 永続化やデータ構造が必要であればRedis、もっとシンプルなものがよければmemcached、といったように用途に応じて使い分ければよいかなと思います。

RDBとの使い分け

一方で、RedisはRDBに比べて次にようなデメリットもあります。

まず、容量が制限されてしまいます。 安価なハードディスクに比べて、メモリは高価です。 また、その容量もせいぜい数十GByte程度です。 高速な分容量が少ないので、大きなデータの格納には向きません。

また、クラッシュセーフではありません。 メモリは揮発的であり、クラッシュするとデータが飛んでしまいます。 スナップショットによる永続化も可能ですが、原理的に完全ではありません。

以上を踏まえると、Redisは

  • 最悪の場合、失っても問題がないもの
  • 高速な読み書きが必要なもの

という性質のデータを格納するのに適していると考えられます。 たとえば動的なページのキャッシュなどがこれにあたります。

また、記事のPVなど確実に整合性を取る必要のないデータも、リアルタイムで読み書きしつつ、定期的に合計値をRDBに格納などすれば、十分実用的だといえます。

基本的な使い方

Redisには多くのコマンドがありますが、代表的なものをいくつか紹介します。 コマンドの一覧は公式ドキュメントをご覧ください。

ただ、実際の開発ではRedisのコマンドというより言語に応じたクライアントライブラリを使うことになると思います。 それぞれのコマンドをライブラリ側でどう操作するかさえ理解できればよいでしょう。

また、各コマンドはTry Redisで気軽に試せるので、あわせてご確認ください。

$ redis-cli
> SET mykey 'value'
> GET mykey //=> "value"
>
> SET mykey 0
> INCR mykey //=> (integer) 1
> INCR mykey //=> (integer) 2
> DECR mykey //=> (integer) 1
>
> HSET mykey fieldy_1 'value_1'
> HSET mykey fieldy_2 'value_2'
> HSET mykey fieldy_3 'value_3'
> HGET mykey fieldy_2 //=> "value_2"
>
> SADD mykey 'member_1'
> SADD mykey 'member_2'
> SADD mykey 'member_3'
> SMEMBERS mykey //=> 1) "member_1"
>                     2) "member_2"
>                     3) "member_3"
>
> ZADD mykey  2 member_1
> ZADD mykey 10 member_2
> ZADD mykey  6 member_3
> ZADD mykey  4 member_4
> ZADD mykey  8 member_5
> ZREVRANGE mykey 0 2 //=> 1) "member_2"
>                          2) "member_5"
>                          3) "member_3"

参考記事

おわりに

アプリケーションのパフォーマンスの向上や、ランキング実装などの用途においてRedisはとても便利です。 次回はより実践的な内容として、RailsアプリケーションでRedisを用いたランキング機能の実装について書きたいと思います。