Redis速習する

ISUCONやっていて、Redisを使いたくなったので今から「Redis完全に理解した」と 言えるレベルになります。

そのためのメモです。 前、別の記事に書いたことですが、インプットとアウトプットの黄金比は3 : 7らしいです。

なんでその日に学んだことはガンガンアウトプットしていきたいと思います。

書くこと

Redisの基本的なコマンド

書かないこと

RDBとRedisの違い、使い分けなど

Redis?

読み方が「レディース」ってマジすか? ずっと「レディス」って呼んでた。

RedisはRemote discionary serverの略でデータベースやキャッシュストアとして使用するKey−Value ストアで RDBと違ってデータはメモリに保存される。

データがメモリ上に保存されるので非常に高速に読み書き出来る。また、データを非同期でディスクに書き込むので永続性も保つことが出来る。

詳しい説明は公式ドキュメントを!

https://redis.io/topics/introduction

「え、データ永続化出来て高速ならRDBいらんやん!」と思う方もいるかもしれませんが(本当か?)どちらにもメリット・デメリットがあるので、適切に使い分ける必要があります。 この記事ではそこまでは書きませんので他のツヨツヨエンジニアさんの記事を探してください、、、 公式ドキュメントにもありそうですが。

触っていこう!

まずは触って「へー。こんな感じね。完全に理解したわ!」となりましょう!

インストールはボクは詰まることはなかったので省略! (brew install redisとかで行けるんでは? macなら)

実際にredis-serverredis-cliを立ち上げて遊んでみよう。

ターミナルでredis-serverと打ち込んで、redis-serverを立ち上げて。

次に、redis-cliと打ち込んで、コンソールが立ち上がったらPINGと打ってみよう。 PONGが返ってきたら、完璧です〜

値を格納して見る

とりあえずhogeを取得してみるぞい

> GET hoge
(nil)

うん。まあ、まだ何もしてないからnilだよね。 ってことでhogehogehogeを格納してみる。

> SET hoge hogehoge
OK
> GET hoge
"hogehoge"

良さそう。 こんな感じで、Redisの名前通り disctionary serverですね。

データ型

基本的に以下のデータ型がvalueとして使えます。( keyはstring) - String (数値もstring扱いみたいや) - List - Set - Sorted set - Hash - その他 (今回は出てこないので割愛!)

データ型に応じてSET, GETなどのコマンドが異なります。

List

lpush, lpopは先頭への値追加、取得。

逆に、rpushとrpopは末尾への値追加、取得です。

lrange は先頭要素と末尾要素を指定して、その間の値を取得する。 0から-1までにすると全取得ですね。

127.0.0.1:6379> lpush list abc
(integer) 1
127.0.0.1:6379> lpush list hoge
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "hoge"
2) "abc"
127.0.0.1:6379> lpop list
"hoge"
127.0.0.1:6379> lrange list 0 -1
1) "abc"

127.0.0.1:6379> rpush list tarou
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "abc"
2) "tarou"
127.0.0.1:6379> rpop list
"tarou"
127.0.0.1:6379> lrange list 0 -1
1) "abc"

Set

Setはsaddで追加、sremで削除します。

smembersで全要素取得出来ます。 また、sismemberである値が含まれているかを確認できます。

127.0.0.1:6379> sadd language en
(integer) 1
127.0.0.1:6379> sadd language ja
(integer) 1
127.0.0.1:6379> sismember language ja
(integer) 1
127.0.0.1:6379> sismember language hoge
(integer) 0
127.0.0.1:6379> smembers language
1) "en"
2) "ja"
127.0.0.1:6379> srem language ja
(integer) 1
127.0.0.1:6379> smembers language
1) "en"
127.0.0.1:6379>

Sorted set

zaddで追加します。このときソートのもとになる値を指定する。 取得はzrangeで、削除はzremで行います。

127.0.0.1:6379> zadd ranking 10000 nasa
(integer) 1
127.0.0.1:6379> zadd ranking 1 NASA
(integer) 1
127.0.0.1:6379> zadd ranking 500 hoge
(integer) 1
127.0.0.1:6379> zrange ranking 0 -1
1) "NASA"
2) "hoge"
3) "nasa"
127.0.0.1:6379> zrange ranking 0 -1 withscores
1) "NASA"
2) "1"
3) "hoge"
4) "500"
5) "nasa"
6) "10000"

Hash

値の追加はhsetで複数のフィールドを同時に追加したいときはhmsetを使用します。 (多分新しいversionなら、hsetで複数のフィールド対応してると思います。)

特定のフィールド値のみを取得したいときはhgetで全取得の場合はhgetallです。

127.0.0.1:6379> hset user:1 name "nasa" email "nasa@mail"
(integer) 2
127.0.0.1:6379> hgetall user:1
1) "name"
2) "nasa"
3) "email"
4) "nasa@mail"
127.0.0.1:6379> hget user:1 name
"nasa"
127.0.0.1:6379> hmset user:2 name NASA email "NASA@mail"
OK
127.0.0.1:6379> hgetall user:2
1) "name"
2) "NASA"
3) "email"
4) "NASA@mail"

うむ。 書くの疲れちゃった、、、、

Qiitaにはこういったクソ記事は上げづらいですが、個人ブログなら気が楽ですね。

よく見る〇〇入門!や〇〇を完全に理解する等の記事を分かりやすく書いている人たちはすごいと思いました。 あと、結構面倒くさいですね、、、

おわり〜。