Redis入門!初心者でもわかるデータ構造(String・List・Set・Hash)の仕組み
生徒
「最近よく『Redis(レディス)』っていう言葉を聞くんですけど、普通のデータベースと何が違うんですか?」
先生
「Redisは、データをメモリという『超高速な机の上』に置くタイプのデータベースです。一般的なデータベースが大きな倉庫から書類を探すようなものだとしたら、Redisは手元のメモ帳をパッと開くような速さが特徴ですね。」
生徒
「メモリ? 難しそうですね…。初心者でもデータを整理する方法は覚えられますか?」
先生
「もちろんです!Redisには『データの形(データ構造)』がいくつか決まっています。今回は、基本の4つの形を身近なものに例えて説明しますね。プログラミングが初めてでも大丈夫ですよ。」
1. Redisとは?高速なデータベースの秘密
Redis(レディス)は、非常に高速に動作するデータベース管理システムです。一般的なデータベース(MySQLなど)は、パソコンの中にある「ストレージ(本棚のような長期保存場所)」にデータを書き込みますが、Redisは「メモリ(作業机のような一時的な場所)」にデータを保存します。
机の上にあるものはすぐに手に取れるのと同じで、Redisは驚くほどのスピードでデータを処理できます。ただし、机の上は広さに限りがあるため、データを整理して効率よく置く必要があります。その整理術が、今回解説する「データ構造」です。
用語解説:データベース
大量の情報をコンピュータの中で整理して、後から使いやすく保存しておく仕組みのことです。
用語解説:メモリ
コンピュータが作業をするためのスペースです。電源を切ると中身が消えてしまいますが、読み書きの速度が非常に速いのが特徴です。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. 基本のデータ構造その1:String(文字列)
String(ストリング)は、Redisの中で最もシンプルで基本的なデータの形です。「キー(名前)」に対して「値(中身)」を一つだけ保存します。これは、小学校で使う「名前シール」を貼った「筆箱」のようなものです。一つの筆箱に一つの名前が付いている状態です。
例えば、「ユーザー名」という名札に「山田太郎」という値をセットするような使い方が一般的です。ウェブサイトの訪問回数を数えたり、パスワードを一時的に保存したりするときによく使われます。
データのイメージ:
key (キー) | value (値)
--------------+------------
user:1:name | 山田太郎
user:2:name | 佐藤花子
login:count | 10
site:status | 稼働中
操作の例:
-- 名前を保存する(SETコマンド)
SET user:1:name "山田太郎"
-- 名前を取り出す(GETコマンド)
GET user:1:name
実行結果:
"山田太郎"
3. 基本のデータ構造その2:List(リスト)
List(リスト)は、データが「順番に並んだ列」のことです。スーパーのレジ待ちの行列や、音楽の再生リストをイメージすると分かりやすいでしょう。データの「最初(左)」か「最後(右)」に、新しいデータをどんどん付け足していくことができます。
例えば、チャットアプリのメッセージ履歴や、SNSの最新ニュースの表示順序などを管理するのに適しています。順番が大切なデータを扱うときに非常に強力です。
データのイメージ(チャットの履歴など):
index (順番) | value (メッセージ内容)
-------------+-----------------------
0 (最新) | こんにちは!
1 | お疲れ様です
2 | 了解いたしました
3 (古い) | よろしくお願いします
操作の例:
-- リストの右端(後ろ)にデータを追加する
RPUSH chat_history "よろしくお願いします"
RPUSH chat_history "了解いたしました"
RPUSH chat_history "お疲れ様です"
-- リストの中身を全部見る
LRANGE chat_history 0 -1
実行結果:
1) "よろしくお願いします"
2) "了解いたしました"
3) "お疲れ様です"
4. 基本のデータ構造その3:Set(セット)
Set(セット)は、データの「集まり」を管理するものですが、Listとは大きな違いが二つあります。一つは「順番がバラバラ」であること。もう一つは「同じデータは二つ以上入れられない(重複禁止)」ということです。これは「福袋」の中身や、「クラスの出席簿」の出席者の名前リストのようなものです。同じ人が二人いると困りますよね。
例えば、ブログの記事につける「タグ」や、オンラインゲームに現在ログインしているユーザーのID一覧などに使われます。「重複を自動で防いでくれる」のが大きなメリットです。
データのイメージ(タグ一覧など):
category (カテゴリ) | values (含まれる要素)
--------------------+---------------------------------------
tags:post1 | { "プログラミング", "初心者", "Redis" }
users:online | { "user_101", "user_205", "user_300" }
操作の例:
-- タグを追加する(「初心者」を2回入れても1つしか保存されません)
SADD post_tags "プログラミング"
SADD post_tags "初心者"
SADD post_tags "初心者"
-- 全てのタグを表示する
SMEMBERS post_tags
実行結果:
1) "プログラミング"
2) "初心者"
5. 基本のデータ構造その4:Hash(ハッシュ)
Hash(ハッシュ)は、一つのキーの中に、さらに「項目(フィールド)」と「値」のペアを複数保存できる構造です。これは「社員名簿の1ページ」や「プロフィール帳」に例えると分かりやすいです。一人の人物に対して「名前」「年齢」「趣味」といった複数の項目が紐付いていますよね。
String(文字列)をいくつも作るよりも、関連するデータを一つのHashにまとめて管理する方が効率的です。会員情報の管理などに最もよく使われる形の一つです。
データのイメージ(プロフィール):
id | field (項目) | value (値)
---+--------------+-----------
1 | name | 田中太郎
1 | age | 28
1 | city | 東京都
1 | hobby | キャンプ
操作の例:
-- プロフィール情報を一括で保存する
HSET user:100 name "田中太郎" age "28" city "東京都"
-- 特定の項目(名前)だけ取り出す
HGET user:100 name
-- 全ての項目と値を取り出す
HGETALL user:100
実行結果:
1) "name"
2) "田中太郎"
3) "age"
4) "28"
5) "city"
6) "東京都"
6. なぜRedisのデータ構造を使い分けるのか?
ここまで紹介した「String」「List」「Set」「Hash」を使い分ける理由は、コンピュータにとって「得意な作業」がそれぞれ違うからです。例えば、何万件もあるデータの中から「順番通りに10件だけ取り出す」ならListが速いですし、「この名前は既に登録されているか?」を確認するならSetが非常に速いです。
プログラミング未経験の方は、まず「Redisにはデータの整理ボックスがいくつか種類があって、やりたいことに合わせて箱を選んでいるんだな」と理解するだけで十分です。適切な箱を選ぶことで、ウェブサイトの表示を速くしたり、アプリを快適に動かしたりすることができるようになります。まずは自分の身の回りにあるデータを「これはListかな?」「これはHashでまとめられそう」と想像してみると、Redisの理解がぐっと深まりますよ。
7. 実際の活用シーン:どんなところで使われている?
Redisは私たちの生活の裏側でたくさん活躍しています。例えば、ショッピングサイトで「最近チェックした商品」を表示するときは、素早く順番通りに表示できるListやSetが使われることがあります。また、SNSで「いいね!」の数をリアルタイムで更新するときには、計算がとても速いStringの機能が使われています。
普通のデータベースと組み合わせて、Redisを「よく使うデータの仮置き場」として利用することで、システム全体の負荷を減らすという役割も持っています。これを「キャッシュ」と呼びます。私たちが普段スマホでサクサクとアプリを使えているのは、Redisのような高速なデータベースが、目に見えないところでデータをテキパキとさばいてくれているおかげなのです。