Persistence

技術メモなど

Redisの基礎知識

Redisについて主に 公式ドキュメント を読み漁った備忘録です。Redisを使って何ができるのかをざっくり知るための情報です。

Redisとは

https://aws.amazon.com/jp/redis/

いきなり公式じゃなくてAWSのドキュメントですが、Redisの特徴やユースケースをわかりやすくまとめられていてとてもイメージが湧いてきました。

チュートリアル

http://try.redis.io/

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

https://redis.io/topics/ldb

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

  • キャッシュとして利用するときに、メモリの上限に合わせて古いキャッシュを削除する機能です
  • LRUというアルゴリズムでキャッシュを管理します
  • Redis4.0ではLFUというアルゴリズムも導入されました

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

  • 複数のインスタンスでデータを分割する機能です
  • すべてのインスタンスにはキーのみを格納し、データは分散して管理します
  • 1台のコンピュータのメモリ搭載量を超えるデータを扱うことができるようになります

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

おわり

RedisについてはSidekiqのデータストアとしてしか利用したことがなかったのですが、キャッシュやPub/Subやその他にも色々な使い方ができそうということが分かりました。Pub/SubやStreamについてサンプル実装などがあったので、次は手を動かしてみたいと思います。

参考