Redisの特徴と
活用方法について
株式会社スカイディスク
大谷 祐司
・株式会社スカイディスク CTO
・山口県下関出身
・今年から福岡に移住してIoTやってます
・2児の父親です
3自己紹介
マンガになりました。 雑誌に寄稿しました。
検索:大人になったらエンジニア 大谷
本日はRedisについて、
特徴や事例など広くお話します。
Redisに興味を持ってもらえる
きっかけになれば幸いです。
Redisとは
Redisは高速に値をRead/WriteできるNoSQLです。
ここ最近とてもメジャーになってきました。
単純なKVSとしての機能だけではなく、
様々な「便利に使える」仕組みを実装しています。
Githubでオープンソースとして公開されています。
BSDライセンスです。
Redisの歴史
2009年にSalvatore Sanfilippoというイタリアの
技術者によって開発されました。
2010年からVMWareが支援を行っています。
C言語で書かれています。
AWSもRedisを提供
2013年9月からAWSのElastiCacheで採用。
Memcached or Redisを選択可能です。
ElastiCache
Redisの特徴
シングルスレッド
Redisはシングルスレッドで動作します。
MySQLのように複数の処理を並列で行う事は不可能です。
必然的に、全てのデータ操作は排他的になります。
Redis
コマンド
コマンド
コマンド
コマンド
1スレッドで
順番に処理
データベースの構造
Redis
DB
Key-Value
Key-Value
Key-Value
Key-Value
DB
IDを指定して複数のDBを持つ事ができます。
各DBは独立してキーと値を保持できます。
Key-Value
Key-Value
Key-Value
Key-Value
高いパフォーマンス
全てのデータセットをメモリ内に読み込む
高速なデータアクセスを実現
※メモリはHDDの数万倍早い。
高いパフォーマンス
複数の操作を1回で実行可能
アプリケーション ⇔ Redis間の通信量を削減
コマンド
コマンド
コマンド
実行
データ構造のサポート
・5種類の型を値として扱う事ができる。
・値を計算して戻す事ができる。
※LUAスクリプティング/セット型の集合演算
複雑なデータ構造の保持や計算を
Redisに任せる事が可能
メモリを使い果たしたら?
特定のルールに従って削除
LRUアルゴリズムなど、
5つのパターンから設定可能
メモリを使い果たしたら?
それでもメモリを確保できないときは、
書き込みが全てエラーになります。
レプリケーション
MASTER-SLAVEのレプリケーション構築が可能。
MASTERは複数台のSLAVEを設定できる。
MASTER
SLAVE SLAVE SLAVE
レプリケーション
Redisのレプリケーションは非同期。
Master-Slaveでデータの差分が出る事がある。
データの特性によって参照先の選択が必要。
データ永続化(バックアップ)
①SAVE/BGSAVE
⇒DBのフルダンプ(RDB = Redis DataBase)を作成。
SAVE/BGSAVE
Redis RDB
全データ
データ永続化(バックアップ)
②AOF(Append Only File)
⇒コマンド実行ログ。ここからデータ復元可能。
コマンド
Redis AOF
コマンド
トランザクション
複数コマンドを纏めて実行
・アトミックな操作の保証(他の処理をブロック)
・MULTIでトランザクション開始
・全て実行(EXEC) or 全て未実行(DISCARD)
MULTI
コマンド
コマンド
コマンド
EXEC(実行)
DISCARD(未実行)
or
Slow-Logの出力
設定の閾値よりも遅いクエリをメモリに記録。
秒数を指定してSLOWLOGコマンドを実行
遅いクエリの一覧を取得
コマンド実行状況の確認
MONITORコマンド実行
受け取ったコマンドを無限にダンプ
(QUITコマンドで終了)
コマンドの実行状況を把握できる。
Luaスクリプティング
スクリプト言語「Lua」をRedis上で実行可能。
予めRedisにスクリプトを登録する事ができる。
高度な計算をRedisで実行可能
Luaスクリプティング
実行中は他のリクエストをブロックする。
時間が長い処理を行うのは危険。
Redis Sentinel
Redisプロジェクトで開発されている管理サーバ
死活監視/通知/自動フェイルオーバーを実現
V2.4.16以降で利用可能
Redis-Cluster
・インスタンスのデータノード化
・耐障害性
・柔軟なスケーリング
http://redis.io/topics/cluster-spec
29
・複数台で分散してデータを持つ(シャーディング)
・同じデータは複数台で持たない。
・ノード毎にMaster-Slave構成が可能
(障害時はSlaveがMasterに自動で昇格)
・ノードを追加/削除した際にリシャーディンングが可能。
Redis Clusterの特徴
30
・ノードに0-16384の数字(slot)を割り振る。
・リクエストのキーを計算して、対象のサーバを判別する。
[HASH_SLOT = CRC16(key) mod 16384]
クラスタリングの概要
[slot 0-5460]
[slot 5461-10922]
[slot 10923-16383]
①サーバを選んで命令
②対象のサーバを判別して命令を転送
node1
node2
node3③命令を実行して結果を返す
アーキテクチャ
Redisのアーキテクチャ
Redisはイベント駆動アーキテクチャで動作。
シングルスレッドでリクエストを処理します。
Redisの動作イメージ
1プロセス/1スレッドで動作
Redis
コマンド
コマンド
コマンド
コマンド
1スレッドで
順番に処理
Redisのアーキテクチャ
1台のサーバで複数コアを活用するには?
同一サーバに複数台のRedisを立ち上げ、
別サーバとして動かす事を推奨。
http://redis.io/topics/faq
RedisはCPUの1コアのみを使用します。
Redisのデータ型
Redisには5つのデータ型があります。
各データ型について紹介します。
文字列型
・全てのデータの基本となる型。
・バイナリセーフで、どんな値でも扱える。
・最大1Gまで扱える。
Orange
リスト型
・文字列型のリスト。
・先頭又は末尾に値の追加が可能。
・リスト長をキャッシュして、高速に取得可能
Apple Orange Lemon Kiwi Peach
1 2 3 4 5
値を順番に保持
セット型
・文字列型の順不同の集合。
・同じメンバを重複して登録する事はできない。
・2つのセットに集合演算が使用できる。
Apple
Orange
Lemon
Kiwi
Peach
値を順不同で保持
セット型の集合演算用のコマンド
積集合(SINTER)
A B
和集合(SUNION)
セット型の集合演算用のコマンド
A B
差集合(SDIFF)
セット型の集合演算用のコマンド
A B
ソート済みセット型
・文字列型の集合。
・「スコア」の値でソートされた順位を持っている。
・同じメンバを重複して登録する事はできない。
・スコアの値、順位で範囲検索が可能。
Apple
スコア
:10
Orange
スコア
:30
Lemon
スコア
:50
Kiwi
スコア
:70
Peach
スコア
:90
1 2 3 4 5
値をスコアの大きさ順に保持
同じスコアの場合の順位は?
同一順位が複数できるのではなく、
全ての値が別の順位になります。
(アスキーコード順にランク)
ハッシュ型
・順番がない文字列型のフィールドと値のマップ。
・フィールド値での検索が可能。
・値を指定しての検索は不可能。
Apple
Orange
Lemon
Kiwi
Peach
A
B C
DE
値とキーをセットで保持
最近の
バージョンアップと機能追加
Ver3.0リリース:2015年3月
・ Redis Clusterへの対応。
・ WAITコマンドの追加。
・ LRUアルゴリズムの改善。
Ver3.2リリース:2016年5月
・GEO API導入(緯度/経度でインデックス)
・Luaスクリプティングのデバッガ
・Redis Cluster強化
Ver4.0リリース準備中:(現時点でRC3)
・ 新しいレプリケーションの仕組み。
・ LFUのキャッシュアルゴリズム。
→参照回数に基づくデータの維持
・ RDBとAOFを合わせたバックアップファイル。
・バックグラウンド処理を利用したデータ削除。
Redisは進化し続けています
Redisを使う方法
Cliが用意されており、
コマンドで操作が可能です。
53
多くの言語やフレームワークで
Redis用のライブラリが存在します。
AWSではElastiCacheとして利用できます。
フルマネージドで、マルチAZに対応しています。
2016年10月からはRedis3.2に対応。
Clusterによるスケールアウトが可能に。
Elasti Cache のパフォーマンス。
15シャードで最大3.5Tのメモリを利用可能。
各シャードは秒間2,000万読み込み、
450万書き込みの性能。
Redisの活用事例
複数サーバからネットワーク経由で利用できる
Webアプリケーションのセッション
たくさんのフレームワークで
セッションストアとして採用されています。
expireを設定することで、セッションの自動的
な削除が可能です。
RDBアクセスのキャッシュ
非常に高いRead/Writeのパフォーマンス
RDBのデータをキャッシュとして保持。
複雑なSQLの実行で時間がかかるとき、
パフォーマンスアップに効果を発揮します。
ゲームのランキングデータ
User:A
スコア
:10
User:A
スコア
:50
User:A
スコア
:70
User:A
スコア
:90
1 3 4 5
ユーザランキング
User:A
スコア
:30
プレイ結果
ソート済みセット型
・「ユーザID」「スコア」をソート済みセットに登録。
⇒スコア順のユーザランキングが生成される。
・順位での検索、ユーザでの検索、スコアでの検索が可能。
※RDBだとランク取得にorder_byが必要になり、処理が重い。
ゲームのランキングデータ
IoTデータの一時データ保存先
センサーデバイス
ゲートウェイ
DBNW/APP
最後に
Redisは様々な機能をもったNoSQLです。
RDB等と組み合わせることで、パフォーマンスの高い
アプリケーション構築を実現することができます。
ぜひ試してみてください。
発表は以上になります。
ご清聴ありがとうございました。

Redisの特徴と活用方法について