Redisについて各データ型と想定用途をまとめてみた

こんにちは。

1,2年くらい前からRedisを使用した案件に携わることが多くなりました。

ここでは、5つあるデータ型と、個人的に考えているそれらの適した使い方についてまとめてみました。

 

Redisとの疎通

データ型云々以前に、Redisと疎通しないことには始まりません。

使用するには、Redis自体のインストールと、PHPで使用する場合はphpredisというモジュールもインストールする必要があります。(インストール手順はここでは割愛します。)

Redisとの疎通方法は下記です。

“REDIS_IP”にはRedisサーバのホスト名を入力し、”REDIS_PORT”にはRedisとの疎通に使用するポート番号を指定します。

Webサーバ内にインストールしている場合は”REDIS_IP”は127.0.0.1などで大丈夫です。サーバ設定次第ですが、ポート番号は6379などが多いようです。

 

Redisのデータ型について

Redisのデータ型には、下記の5つのものがあります。

  • String型
  • Hash型
  • List型
  • Set型
  • SortedSet型

それでは、それぞれのデータ型と想定用途について書いていきます。

 

String型

KeyとValueが1対1の関係で管理されるデータ型です。

Cookieに近い管理のされ方でして、Redisをセッションサーバとして使用する場合はString型でデータ格納すると管理がしやすいかと思います。

また、「setnx」というメソッドで、すでに使用されているKeyならばデータ保存せずfalseを返し、まだ利用されていないKeyであればデータ保存しつつtrueを返すメソッドがあるのですが、こちらを利用してユニークなIDを生成することができます。

 

Hash型

親Key、子Key、Valueにより管理されるデータ型です。

例えば、親Keyを商品ID、子キーを商品の属性情報を保存するような形で使用すれば、RDBでのデータ管理に近い考え方で使うことができます。(リレーショナル機能はありませんが)

また、hMSetメソッドを使うことによりデータの登録部分のコードをスッキリ書くことができます。

 

List型

一つのKeyに対してValueを複数管理することができます。Valueは登録された順番も管理されるため、配列のような形でデータを取り扱うことができます。

上記例では日付を直入れしてますが、例えばdate(‘Y-m-d H:i:s’)みたいに設定しておけば、プログラムにアクセスするたびにアクセスログを貯めていくような使い方ができるなと思いました。もっと細かく情報を取得したい場合は、Hash型の方が向いているとは思いますが・・・

 

Set型

一つのKeyに対してValueを複数管理できる点はList型と同様ですが、こちらは登録された順番は管理しません。かわりに、異なるKeyで管理されたデータ群同士で、和・差・積を算出することができます。

こちらの型、未だ有効活用できる場面に遭遇したことがありません・・!活用できる場面などありましたら逆にご教授ください!

 

SortedSet型

KeyとValueの他に、「Score」をセットすることで、Score順に並んだ形でデータ管理を行うことができます。

主にゲームなどの得点管理、ランキング管理などに大きな効果を発揮します。データをMySQLなどにため、PHPで演算することによりランキング情報を出すことも可能ですが、Redisはデータを保存したタイミングですでに得点順も管理されているため、あとはデータを取り出すだけです。そのため、処理が圧倒的に速いというメリットがあります。

ゲームのランキングを表示する際に、同着順位のロジックを組むのは少し大変ですが、下記のような出し方で楽に出すことができます。

 

まとめ

たまに、「MySQLとどっちがいいの?」という質問を受けるときがあるのですが、一長一短だと思っています。というのも、MySQLは複数テーブル構造ということで複雑なデータを管理しやすく、リレーション・ユニークキーなどデータの整合性を保つのに必要な機能が多く含まれています。一方Redisは、最終的にはサーバ内のディスクにデータが保存されますが、保存直後はメモリに一時保存されるため、データ揮発の可能性はゼロではありません。個人情報などの大事なデータに関しては、MySQLなどRDBに保存したほうがいいかと思います。

その代わり、RedisはI/Oの速さが長所で、消失してもダメージが少ないが、大量アクセスが見込まれるような、ゲームコンテンツなどで使用すると、高い効果を発揮できると思います。

●この記事を書いた人