目的
案件で触らせてもらうことになったぜ
何もわからないぜ
という状態なので、自分が調べたことについてまとめておきます。
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