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-server
とredis-cli
を立ち上げて遊んでみよう。
ターミナルでredis-server
と打ち込んで、redis-serverを立ち上げて。
次に、redis-cli
と打ち込んで、コンソールが立ち上がったらPING
と打ってみよう。 PONG
が返ってきたら、完璧です〜
値を格納して見る
とりあえずhoge
を取得してみるぞい
> GET hoge (nil)
うん。まあ、まだ何もしてないからnilだよね。 ってことでhoge
にhogehoge
を格納してみる。
> 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にはこういったクソ記事は上げづらいですが、個人ブログなら気が楽ですね。
よく見る〇〇入門!や〇〇を完全に理解する等の記事を分かりやすく書いている人たちはすごいと思いました。 あと、結構面倒くさいですね、、、
おわり〜。