【Rails】Redisとは？〔使い方やインストール〕

##Redisとは
``Redis``はオープンソースの永続化可能なインメモリデータベース（In-memory database）。

Twitter・Github・Pinterestなどのサービスが``Redis``を採用しており、大規模データの処理や処理速度の向上を実現している。

宣伝・予約システムにおけるユーザー監視や、大量のフォロー・フォロワー関係の管理に適したデータベースである。

>インメモリデータベースとは、専用データベースです。
・データをディスクや SSD に保存するデータベースではなく、データストレージ用のメモリに主に依存します。
・ディスクにアクセスする必要性を除くことによって、最小限の応答時間で済むように設計されました。
・すべてのデータはメインメモリにのみ保存および管理されているので、インメモリデータベースは処理やサーバー障害によってデータが失われてしまうリスクがあります。
・すべてのオペレーションをログに保存したりスナップショットを取得したりすることで、データを存続することができます。
https://aws.amazon.com/jp/nosql/in-memory/

##Redisの特徴
**``①データ永続化機能``**
メモリのデータが揮発性なので、時間が経つとデータが消えてしまうが、メモリ上のデータをストレージに格納してデータを永続的に保持する機能がある。

スナップショットとして保存する**``RDB``**と、コマンドを記録する**``AOF``**によって、データを永続的に保存している。

・**RDB**
``RDB``とは、データベースのダンプファイルのようなものを、スナップショットで保存する方法。

自動的にデータを保存するように設定でき、データのバックアップを取ったりする手間は無いが、トラブルが発生した際に、直前のデータを復旧できないなどのデメリットもある。

>ダンプファイルとは、コンピュータのメインメモリ（RAM）などのある瞬間の内容を、ストレージ（外部記憶装置）上のファイルに丸ごと写し取ったもの

・**AOF**
``AOF``とは、データベースの操作中に使用したコマンドのログを取って、データをバックアップする方法。

AOFは、数秒単位の短い時間でコマンドのログを取っているので、コマンドの実行速度が落ちてしまうが、トラブルが発生した際にも直前のデータを復旧できる。

**``②マスター・スレーブ型レプリケーション機能``**
マスター・スレーブ型レプリケーション機能とは、マスターに書き込んだデータをスレーブにコピーする機能で、スレーブがマスターとデータを同期しながら読み込みに応答する。

マスター・スレーブ型レプリケーション機能により、データベースの書き込みと読み取りにかかる負荷を分散できる。

>
-マスター・スレーブ型レプリケーション機能の用語のざっくり説明-
マスター : 正常時の処理
スレーブ : 予備の処理
レプリケーション : 複製・コピー

##Redisを利用するメリット
1.複雑な型のデータを操作し保存できる
2.各種アプリケーションから高速でアクセスできる
3.不整合が生じない
4.各言語のクライアントで取得したデータを使用可能

###1.複雑な型のデータを操作し保存できる
Redisは、Key-Valueによってデータを保存するデータベースだが、一般的なKey-Valueのデータベースとは違って、複数のデータ型が用意されている。

文字列型やリスト型、ハッシュ型などのさまざまなデータ型が用意されており、複雑な方のデータも操作して保存できる。

###2.各種アプリケーションから高速でアクセスできる
Redisは非リレーショナルデータベースなので、リレーショナルデータベースよりも高速にデータにアクセスでき、各種アプリケーションからも高速でアクセスできる。

>行と列によって構成された「表形式のテーブル」と呼ばれるデータの集合を、互いに関連付けて関係モデルを使ったデータベースのこと。「RDB」と略されることもある。

###3.不整合が生じない
Redisは、アトミックな性質を持つデータベースで、トランザクション処理のように複数の操作を一連の流れで実行する際にも、全ての操作が正しく完了しない限り、データが最初の状態に戻る。

複数の処理がすべて実行されるか、全く実行されないことが保証されているので、複雑な操作の際にも不整合が生じない。

###4.各言語のクライアントで取得したデータを使用可能
データ型を利用することで、JavaやPython、PHPなどの各言語のクライアントで取得したデータを使用できる。

##Redisを利用するデメリット
1.データの揮発性
2.メモリの消費が大きい

###1.データの揮発性
メモリ上で動作するデータベースなので、データに揮発性がある。データベースが動作するメインメモリは、高速にデータへアクセスでが、揮発性があるので、一時的にしかデータを保存できない。

揮発性のあるRedisでは、RDBやAOFなどを利用して、HDDやSSDなどの永続的に保存できるストレージに、データベースのバックアップを取っておくことが大切。

###2.メモリの消費が大きい
メモリ上で動作するデータベースなので、常にメモリを消費してしまい、他の作業に割けるリソースが減る。

また、データベースの書き込みや削除を繰り返すことで、メモリ内のデータが断片化してしまい、コンピューターのパフォーマンスが低下する可能性もある。

##インストール
インストールにはhomebrewを使用する。

```
$ brew install redis
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/cask, homebrew/core).
==> Updated Formulae
amazon-ecs-cli            docker-swarm              firebase-cli              fuse-emulator             libspectrum               libxmlsec1                ohcount                   ppsspp                    telegraf                  traefik                   wolfssl

==> Downloading https://homebrew.bintray.com/bottles/redis-4.0.9.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-4.0.9.sierra.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
  brew services start redis
Or, if you don't want/need a background service you can just run:
  redis-server /usr/local/etc/redis.conf
==> Summary
🍺  /usr/local/Cellar/redis/4.0.9: 13 files, 2.8MB
```

##すぐ使いそうなRedisのコマンド欄

```
#バージョン確認
redis-server --version
redis-server -v

redis-cli --version
redis-cli -v

#Redisサーバーの起動。強制終了は Ctrl+C （※ データが保存されないことがある）
redis-server

#クライアントからサーバーに接続(別のターミナルでRedisサーバーに接続)
redis-cli

#クライアントの終了
exit

#クライアントからサーバーの終了（※ データが保存される）
shutdown
```

##参考記事
[Redisとはどのようなデータベース？3つの特徴や使い方についても解説](https://www.fenet.jp/infla/column/%E6%9C%AA%E5%88%86%E9%A1%9E/redis%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%EF%BC%9F3%E3%81%A4%E3%81%AE%E7%89%B9%E5%BE%B4%E3%82%84%E4%BD%BF%E3%81%84/)
[Redisの特徴と基本的な使い方をわかりやすく解説！Redisの用途と活用方法・メリットは？使えるコマンド一覧もご紹介](https://agency-star.co.jp/column/redis)
[RedisのCRUD](https://qiita.com/yoh-nak/items/fce5417ebbf613d436f1)
[MacにRedisをインストールする](https://qiita.com/sawa-@github/items/1f303626bdc219ea8fa1)