Redisの基礎知識
Redisについて主に 公式ドキュメント を読み漁った備忘録です。Redisを使って何ができるのかをざっくり知るための情報です。
Redisとは
https://aws.amazon.com/jp/redis/
いきなり公式じゃなくてAWSのドキュメントですが、Redisの特徴やユースケースをわかりやすくまとめられていてとてもイメージが湧いてきました。
チュートリアル
Try Redisは対話形式でRedisの基本的なコマンドを学ぶことのできるコンテンツです。公式のトップページにもリンクされています。Redisを全く触ったことがない場合は、まずはここでRedisを体験してみるのが良さそうです。
データ型
https://redis.io/topics/data-types-intro
チュートリアルよりも詳しいデータ型についての説明です。
Stream型
https://redis.io/topics/streams-intro
Redis5.0から追加された新しい型です。Pub/Subができる時系列データです。
https://aws.amazon.com/jp/redis/Redis_Streams/
こちらのAWSブログの記事では、Stream型を使った具体例が示されており、理解の役に立ちました。
主要な機能
https://redis.io/documentation
Documentationの Programming with Redis の項目についての概要です。
Pipelining
https://redis.io/topics/pipelining
- 複数のコマンドをまとめてリクエストする機能です
- Redis内部ではコマンドがキューで管理され、全てのコマンドが処理されたらレスポンスが返ります
- コマンドを1件ずつリクエストするよりも、ネットワークのRTTやRedisコンテキストスイッチを減らすことができ、待ち時間を減らすことができます
- ReadとWriteをまとめて行いたい場合には、Redis2.6で追加されたScriptingを使います
Redis Pub/Sub
https://redis.io/topics/pubsub
- チャンネルにメッセージを送信したり、チャンネルをSubscribeする機能です
- 複数のチャンネルをSubscribeすることができます
- SubscribeやUnsubscribeにはパターンマッチが使えます
- パターンマッチの場合はメッセージの形式が通常のメッセージの形式とは異なります
- パターンマッチでSubscribeシテイルチャンネルのメッセージ受信と、通常のSubscribeしているチャンネルのメッセージ受信は重複します
Redis Lua scripting
https://redis.io/commands/eval
- Redis2.6で追加されたLuaインタープリタの機能です
- LuaスクリプトをEVALコマンドで送信してRedis上で実行します
- Redisの組み込み関数 redis.call(), redis.pcall() などが提供されています
Debugging Lua scripts
Memory optimization
https://redis.io/topics/memory-optimization
- このページは機能ではなくメモリ最適化のためのチェックリストです
Expires
https://redis.io/commands/expire
- キーにタイムアウトを設定することで、自動的にキーが削除される機能です
Redis as an LRU cache
https://redis.io/topics/lru-cache
Redis transactions
https://redis.io/topics/transactions
- コマンドをグループにして実行する機能です
- グループのコマンドが実行されるとき、他のコマンドの割り込みは発生しないのでアトミックな操作として実行できます
- つまりグループのコマンドがすべて処理されるか、全て処理されないかのいずれかの状態になります
Mass insertion of data
https://redis.io/topics/mass-insert
- 大量のデータを挿入する機能です
- 1コマンドずつ登録する方法や、Pipelineを使って登録する方法は推奨されません
- データが書かれたファイルを読み込ませて登録する方法を利用します
Partitioning
https://redis.io/topics/partitioning
Distributed locks
https://redis.io/topics/distlock
- RedlockというアルゴリズムによりRedisで分散ロックを実装する方法を記載しています
- 実際にそれを行うのはクライアントライブラリです
Redis keyspace notifications
https://redis.io/topics/notifications
- Redis2.8で追加されました
- Pub/Subのチャンネルを通してメッセージ以外の情報を通知する機能です
Creating secondary indexes with Redis
https://redis.io/topics/indexes
- 構造化されたデータに対してインデックスを追加する機能です
- ソートされたセット型のデータのソートキーにインデックスを作ることでvalueとObjectIDのインデックスを作ったりできます
- ただしインデックスの値は手動で登録/更新が必要です
- いろいろ柔軟に使えそうです
Redis modules API
- Redis4.0で追加されました
- Redisにカスタムのデータ型とコマンドを追加する機能です
- 公開されているモジュールの一覧
おわり
RedisについてはSidekiqのデータストアとしてしか利用したことがなかったのですが、キャッシュやPub/Subやその他にも色々な使い方ができそうということが分かりました。Pub/SubやStreamについてサンプル実装などがあったので、次は手を動かしてみたいと思います。
参考
- Redis および詳細ページ
- Redis | AWS および詳細ページ
- Dive Deep Redis ~ 入門から実装の確認まで ~ | hayashier