こちらの記事では、Redisについて解説します。
Redisは、データベースの一種です。データベースの種類はいくつかに分類することができ、その中でもRedisは、NoSQLの仲間です。一般的によく知られているMySQLやPostgreSQLなどのRDBと何が違うのか、メリット、デメリットを解説していきます。
本題のRedisの話に入る前に、RDBとNoSQLの違いについておさらいします。
RDBとは?
RDBは、「Relational DataBase」の略で、データベースの一種です。関係データベースとも呼ばれます。RDBはデータをExcelのような行と列で構成する表で管理し、それを複数持つことで必要なデータを組み合わせ、複雑なデータを扱うことができます。
RDBはMySQLやPostgreSQLなどのRDBMS(Relational DataBase Management System)によって管理されています。
代表的なRDBMS
- MySQL
- PostgreSQL
- Oracle Database
- SQL Server
- DB2
RDBのメリット
-
SQLにより複雑な操作が可能
SQLとは、RDBMSを操作するための言語です。RDBMSは、MySQL・PostgreSQL・SQL Serverなどいくつかの種類があります。それぞれのRDBMSでSQLの記述方法は若干異なる部分はありますが、基本的な部分は同じなため、全てのRDBMSはこのSQLによって操作が可能です。
また、上図のように同一の形式のデータをテーブルという単位で管理し、テーブル同士を結合することでより複雑なデータの取得が可能となります。
-
ACID特性によるデータの安全性
RDBMSは、ACID特性に基づいて設計されており、データ処理の一貫性等が保証されています。ここでいう一貫性とは、処理が正しく実行されればその結果が表示され、処理が正しく実行されなければ前の状態が表示される性質のことです。
AさんがATMから、Bさんの口座に現金を1000円振り込む例を考えてみます。
AさんがATMからBさんの口座に現金を振り込む処理の最中に停電や、システムの障害が発生したとします。この場合、全ての処理が完了していないので1000円は処理をする前のAさんの口座に残った状態が表示されます。仮に障害が発生した時点でBさんの口座への入金処理が完了していれば、Bさんの口座に1000円がプラスされます。
RDBのデメリット
-
処理速度が遅い
RDBのメリットで複雑な処理が可能と説明しましたが、これはデータ取得時に内部で複雑な処理をすることで実現しています。しかし、複雑な処理をするには時間もかかってしまうため、データ量が増えれば増えるほど処理速度が遅くなります。
-
分散管理時にデータの書き込みができない
負荷分散やレスポンスを早めるために、RDBを複数台(A、B)にしたとします。データの読み込みは、AとBで同じデータを持っているため可能です。
一方で、書き込みですが、RDBのメリットはデータ処理の一貫性が保証されていると説明しました。一貫性が保証されているということは、AとBで常に同じデータを持っている必要があります。そのためAにデータの書き込みをするとBにも同じ書き込みをする処理が必要になります。これでは非常にコストがかかってしまうため、RDBは分散管理には不向きです。
RDBが適している分野
データを表形式で格納するため、以下のような分野に適しています。
- 社内データの管理用データベース
- 顧客情報の管理データベース
- 生産管理システムのような複雑な情報を扱うもの
NoSQLとは?
NoSQLは「Not Only SQL」の略で、RDBのような関係データベース以外のデータベースを指します。RDBと異なり、テーブルやテーブルが持つ属性(名前、年齢、部署など)を定義せずにデータを格納することができます。そのため、データアクセスにSQLは使用しません。
RDB が持つ「大容量データを取り扱う際の処理速度が低下する」という課題を解決する新しいデータベースです。
NoSQLの種類
-
キーバリュー型
キーバリュー型はデータを識別する一意のキーと、キーに対応するバリューで構成されます。バリューに関しては、データごとに異なっても問題ありません。キーとバリューだけの構造のため、処理が高速で容量も少なくなります。ただし、複雑な検索には適していません。
-
カラム指向型
カラム指向型は、キーバリュー型にカラム(列)の概念を持たせたモデルです。キーが複数のカラムを保持しており、随時追加可能です。
列でデータを扱うため、データの集計や、条件を満たす列を検索するといった操作が容易にできます。
-
ドキュメント指向型
キーとJSONやXMLのドキュメント形式のデータを組み合わせた構成です。ドキュメントを埋め込めるため、1レコード内に複雑な階層関係を含めることができます。そのため、キーバリュー型よりも複雑なクエリが可能です。
NoSQLのメリット
-
処理が高速
NoSQLが必要とされる理由の一つとして、RDBの低速な処理が上げられます。RDBはデータ同士が関連しているためデータが増えれば増えるほど、処理が低速になります。一方NoSQLはデータ同士の関連はなく、非常にシンプルであるため処理を高速に行うことができます。
-
スケールアウトしやすい
スケールアウトとは、システムを動作させるために、サーバーの台数を増やし処理能力を高めることです。RDBの場合、データの一貫性が必要になるためスケールアウトは不向きですが、NoSQLではデータの一貫性を気にする必要はないためスケールアウトに適しています。
NoSQLのデメリット
-
データの一貫性を保つことができない
NoSQLのメリットの一つとして、スケールアウトに適していると説明しました。これは言い換えるとNoSQLはデータの一貫性を保つことができないため実現できます。
-
複雑な処理に弱い
単純なデータを高速で登録、読み込みは得意ですが、複雑な処理には不向きです。
NoSQLが適している分野
NoSQLは大量のデータを高速に扱うのが得意なため、以下のような分野に適しています。
- 大量のデータを処理するIoTのシステム
- SNSの分析
Redisとは
Redisとは、NoSQLのキーバリュー型の一つで、メモリ上でデータを管理するインメモリデータべースです。
インメモリデータベースとは
インメモリデータベースとは、データをハードディスクなどに保存するデータベースと異なり、メモリ上でデータを管理するデータベースのことです。
メモリはハードディスクに比べ処理速度が非常に高速なため、インメモリデータベースは一般的なデータベースに比べ、データの読み書きを高速に処理できるメリットがあります。
メモリ上でデータを管理するデメリットも勿論あります。メモリはハードディスクに比べ容量が非常に小さいため、大きなデータを扱う場合、他の処理に使用するメモリの容量が小さくなります。またメモリは揮発性なため、なんらかの障害で給電が途切れると保存しているデータが全て消失してしまいます。
Redisの特徴
-
複数のデータ型に対応
一般的にキーバリュー型では、キーに対して文字列値を関連づけてデータを保存しています。それに対して、Redisではキーに対して以下のような複数のデータ型の値を保持することができます。これにより、各言語で取得したデータをそのまま使用することができます。
Strings(文字列型)
Lists(リスト型)
Sets(セット型)
Hashes(ハッシュ型)
Sorted sets(ソート済セット型)
etc…
-
不整合が生じない
Redisはアトミックな性質を持つデータベースです。
これはトランザクション処理のように複数の操作を一連の流れで実行する場合、処理の途中で障害が発生した際は処理を実行する前の状態に戻ります。一連の処理が全て完了するか、全く実行されないことが保証されています。
-
データの永続化
メモリ上でデータ管理するインメモリデータベースのデメリットとして、給電がストップすると全てのデータが消失するとすでに説明しました。Redisではこの欠点を補うための仕組みがあります。
Redisのデータ永続化
Redisにはデータを永続化するオプションが提供されています。これによりコンピュータを停止したとしても、起動時にデータを復元することができます。
-
RDB
RDBでは指定した間隔でデータのスナップショットを保存します。RDBは、バックアップファイルがコンパクトであるというメリットはありますが、一定間隔のスナップショットでの保存のため、一部データが消失する可能性があります。そのため、データの消失が許されない場合には不向きです。
-
AOF
サーバーが受け付けた全ての書き込みコマンドを保存します。デフォルトでは秒単位で、データをファイルに保存します。これは、RDBを使用するよりもデータの消失を少なくします。そのため、データの消失を極力無くしたい場合に使用されます。
ただし、実行速度が低下するデメリットもあります。
レプリケーション
Redisには負荷分散や耐障害性を目的とした機能が提供されています。これをレプリケーションと呼び、Redisではマスタースレーブレプリケーションが採用されています。
マスターは読み書きの機能を持つメインのサーバーで、読み込み専用のスレーブサーバーにマスターのデータをコピーします。これにより、参照先が分散されるため負荷分散を実現できます。マスターは複数のスレイブを持つことができ、万が一マスターに障害が発生した場合は、スレイブの内の一つがマスターとなることで、システムを継続することができます。
Redis クラスター
Redisはメモリ上でデータを管理するインメモリデータベースのため、容量が少ないというデメリットがあります。このデメリットを解決するために、サーバーを複数台用意し、これらをまとめて一つのデータベースと見なすことで解決しています。
データを複数台に分散させて管理することをシャーディングと呼び、Redisクラスターはシャーディングを管理します。Redisクラスターは複数のノードで構成され、各ノードはslotという識別子が付与されたデータを分散させて保持します。
例えばノード1、ノード2、ノード3があり、ノード1は0-5000、ノード2は5001-10000、ノード3は10001-15000のスロットを保持しているとします。
ユーザーが、5002番のスロットのデータが欲しいと命令すると、3つのノードの内のどれかに命令が行き、仮に命令を受けたノードが5002番のデータを保持していなければ、ノード間でやり取りがされ最終的に5002番のデータを持つノードからデータが返されるという仕組みです。
まとめ
以下は、Redisについてまとめた結果です。
- Redisとはキーバリュー型のNoSQLで、インメモリデータベースです。
- 特徴としては、複数のデータ型に対応、不整合が生じないなど、一般的なNoSQLの弱い部分を補う機能が提供されています。
- レプリケーションやRedisクラスターなどの機能が提供されていることも魅力の一つです。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2022.12.28
DB分野におけるER図の書き方やツールについて
この記事では10種類ほどあるER図の表記法の中から代表的なIEについて解説します。
- データベース
2023.08.27
NoSQLとは? 成り立ちと概要を解説
NoSQLがなぜ登場しどのような価値を提供するのかを理解するためにはその背景を知ることが不可欠です。
- データベース
2023.03.18
【DB】クライアントツール「Table Plus」の導入方法と基本操作を解説
TablePlusは**GUI**でデータベースを操作することのできるクライアントツールです。
- データベース