目的

案件で触らせてもらうことになったぜ
何もわからないぜ

という状態なので、自分が調べたことについてまとめておきます。

Radis とは

  • REmote DIctionary Serverの略
  • 読んで字の如く、ネットワーク接続されたKey-Value型のNoSQLデータベース
  • 永続化可能なインメモリデータベース
  • オープンソースのプロジェクトで、Redis Labsがスポンサー。中身はC言語
  • AWS上でもRedis-serverが提供されている
  • 様々なデータ構造をサポートしている
STRING
LIST
SET
HASH
ZSET (ソート済みのset)

補足:インメモリDB

すべてのデータをコンピュータのメインメモリ上に展開しながら動作する仕組みのことです。
コンピュータ(サーバ)の電源が落ちれば消えてしまうので、永続化の手段としてデータを別途どこかに保存することがあります。

インメモリデータベースでサーバが落ちたらデータはどうなる? インメモリとカラム型データベースの可能性を調べる(その3) - Publickey

インストールと動作確認

少し挙動を試してみたいだけなら、公式チュートリアルの画面でコマンドを叩くことができます。
Try Redis

Macであれば下記brewコマンドで一発。

$brew install Redis

インストールできたら、サーバを立ち上げてみます。

$ redis-server
# 立ち上がったら別のタブで動作確認
$ redis-cli
127.0.0.1:6379> set test "hoge"
OK
127.0.0.1:6379> get test
"hoge"

動作確認までできました。

このコマンドを叩く先のredis-serverがローカルにあるかAWS上のサービスとしてあるかが変わってくるだけで、cli側の設定や叩き方は基本的に変わりません。
(PythonなんかでRedisクライアントを作成する時に指すHOSTが変わってくるくらい、の認識です)

データのタイプ

Redisは前述の通り様々なデータタイプに対応しています。
どのデータタイプを使用するかによって、コマンドやデータの指定方法が違ってきます。

コマンドの詳細などは公式ドキュメントで。
Data types – Redis

Strings

最も基本的な、KeyとValueが1:1な構造。
Key = valueの形。

  • バイナリセーフ(JPEG画像やシリアル化されたRubyオブジェクトなども格納可能)
  • 最大512MBまで
127.0.0.1:6379> set string-key "value1"
# OK
127.0.0.1:6379> get string-key
# "value1"

Lists

文字列のリスト構造。
Key = [value1, value2, ...]の形。

  • 挿入順にソートされる
  • 先頭/末尾に対して追加、削除を実行する
  • リストの最大長は4294967295
  • リストの両端(先頭、末尾)へのアクセスは早いが、基本的にO(N)操作なので、膨大な量のリストの中間値へのアクセスは遅くなる
127.0.0.1:6379> LPUSH list-key a
# (integer) 1
127.0.0.1:6379> LPUSH list-key b
# (integer) 2
127.0.0.1:6379> RPUSH list-key c
# (integer) 3
127.0.0.1:6379> LRANGE list-key 0 3
# 1) "b"
# 2) "a"
# 3) "c"

Sets

順序、重複なしの文字型集合構造。
Key = (value1, value2, ...)の形。

  • Valueの追加、削除、存在のテスト(要素の数に関係なく一定時間で動作)が可能
  • 重複を許可せず、よしなにしてくれるので存在を確認してから追加する必要がない
  • セット内の最大数は4294967295
127.0.0.1:6379> SADD set-key value1 value2 value3
# (integer) 3
127.0.0.1:6379> SMEMBERS set-key
# 1) "value3"
# 2) "value2"
# 3) "value1"

Hashes

重複なく、順序のないfield:valueのセットを持つ構造。
Key = {field1: value1, field2: value2, ...}の形。

  • field:valueのセットの最大数は4294967295
  • オブジェクトを表すのにも使用される
  • 少量(100くらい)のハッシュは、スペースをほぼ取らない方法で格納されるので、小さなRedisインスタンスに数百万のオブジェクトを格納できる
127.0.0.1:6379> HSET hash-key field1 value1
# (integer) 1
127.0.0.1:6379> HSET hash-key field2 value2
# (integer) 1
127.0.0.1:6379> HGETALL hash-key
# 1) "field1"
# 2) "value1"
# 3) "field2"
# 4) "value2"

Sorted Sets

重複なし、Scoreによる順序があるvalue:scoreのセットを持つ構造。
Key = {value1: score1, value2: score2, ...}の形。

  • valueは一意、scoreは重複する可能性がある
  • 要素の追加、削除、更新がO(log(N))操作でできるため高速
  • 要素はscore順で並べられ、後で並べ替えられるわけではない(ランク付けなどに便利)
127.0.0.1:6379> ZADD sort-key 10 user_1
# (integer) 1
127.0.0.1:6379> ZADD sort-key 20 user_2
# (integer) 1
127.0.0.1:6379> ZRANGE sort-key 0 5 WITHSCORES
# 1) "user_1"
# 2) "10"
# 3) "user_2"
# 4) "20"

まとめ

Redisは早くて便利。

参考にさせていただいたもの

Data types – Redis
【初心者向け】Redisのデータ型とPythonでの使い方サンプル - Qiita
【入門】Redis - Qiita