インフラ

【Redis基礎】データ型のList型とHash型について

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

前回の記事の続きで、
本記事では、List型とHash型を取り上げようと思います。

String型と同じく、これらのデータ型も重要なので、
しっかりマスターしてもらえると幸いです。
これらのデータ型は、たくさんのコマンドがあるので、
ある種のチートシート的にも使えるよう執筆しました。

List型

List型はわりとそのまんまで、
RedisのString型のリストです。

順序を保持して、値を保存します。

試しに何か格納してみます。

LPUSH sample_list 123 153 test
LRANGE sample_list 0 -1

sample_listというキーに123、153、testを
格納し、LRANGEで0(最初から)から-1(リストの最後)を取得します。

 

List型のコマンド

一覧は、下記のドキュメントに詳しく書かれております。

https://redis.io/commands/?group=list

LPOP

キーで指定したリストから、最初の要素を消して、
その値を返すコマンドです。

LPOP sample_list
LPOP sample_list 2

keyのあとに数値を指定すると、
その数まで削除します。

LPUSH

こちらは、LPOPの逆で、
指定した値をすべて先頭に挿入します。

LPUSH sample_list 123 153 test
LPUSH sample_list testtest
LRANGE sample_list 0 -1

RPOPとRPUSH

これは、指定した値をそれぞれ
末尾に対して操作するLPOPとLPUSHに該当します。

LINDEX

キーのリストの、指定したインデックスの位置にある要素を返します。
下記はindex 1の要素を返します。

LINDEX sample_list 1

LINSERT

こちらは、簡単な探索ができるようなコマンドで、
キーの直後(AFTER)または直前(BEFORE)に、
起点となる要素(下記の場合、153)の後(前)に
指定した要素(下記の場合、110)を挿入します。

LINSERT sample_list BEFORE 153 110
LRANGE sample_list 0 -1

pivot(検索する起点となる要素)がない場合、
-1を返します。

redis-cli> LINSERT sample_list BEFORE not_found 110
(integer) -1

そもそもkey自体が存在しない場合は、
0を返します。

redis-cli> LINSERT sample_listee BEFORE 153 110
(integer) 0

LLEN

シンプルにリストの長さを返します。

 LLEN sample_list

LRANGE

こちらは、既に何回か使っているが、
List型における、事実上のKeysコマンドに相当するかと思われる。

すべての要素を確認する場合は、
下記のようにする

LRANGE sample_list 0 -1

始点は0から始まり、末尾は-1と表現できるので、
最初から最後まで取得するという意味になる。

これ以外にも、文字通り範囲指定的な使い方もできて、
末尾から2つの要素を取得するなら、

LRANGE sample_list -2 -1

最初から、3つの要素を取得するなら、

LRANGE sample_list 0 2

といった感じだ。

LSET

こちらは、LISTにおける、
SETコマンドのようなもので、
indexを指定して、その要素を更新する。

LSET sample_list 0 first_test

Hash型

Hash型は、List型の階層を深くしたような、
データ型で、フィールドと値を対として持つデータ型です。

ちょうど、RubyのHashと似ているので、
イメージとしては、こんな感じですね。

参考【Ruby】ハッシュとシンボルについて 省略記法やシンボルと文字列の違い

本記事では、Rubyの文法の中でも特徴的な、ハッシュとシンボルについて紹介します。 特にシンボルについては、他のプログラミング言語では、あまり見かけないデータ構造かと思います。 こうしたハッシュとシン ...

続きを見る

平たいイメージで言うと、
親キーと子キー(フィールド)と値があるような感じです。

parent: (child1 => 'value1', child2 => 'value2')

上記のようなイメージです。

実際にコマンドを使うと、

HSET parent child1 value1 child2 value2
HGET parent child2

このような感じですかね。

Macとマグカップの画像

Hash型のコマンド

ドキュメントは、下記です。

https://redis.io/commands/?group=hash

HDEL

こちらはシンプルに要素を削除する系のコマンドで、
キーとフィールドを指定する。

HDEL parent child2

HEXISTS

こちらはhash版のEXISTSコマンドに相当するものかと思われます。
フィールドが存在すれば1を、存在しなければ0を返します。

redis-cli> HEXISTS parent child1
(integer) 1
redis-cli> HEXISTS parent child2
(integer) 0

HGET

先程も軽く使ったが、
指定したフィールドに関連づく値を返します。

HGET parent child1

HGETALL

これはListでいう、LRANGE、
汎用コマンドでいう、KEYSコマンドに近いもので、
キーで指定した、フィールドと値を返します。

redis-cli> HSET parent child3 test
(integer) 1
redis-cli> HGETALL parent
1) "child1"
2) "value1"
3) "child3"
4) "test"

HKEYS

こちらは、フィールドだけを返す、HGETALLのようなコマンド

redis-cli> HKEYS parent
1) "child1"
2) "child3"

HVALS

こちらは、フィールドの値だけを返す、HGETALLのようなコマンド

redis-cli> HVALS parent
1) "value11"
2) "test"
3) "value22"

HLEN

フィールドの数を返します。

HLEN parent

HSET

キーで指定したハッシュについて、
フィールドと値のペアを挿入します。
先程も軽く使いましたね。
既にフィールドが存在する場合は、上書きとなります。

HSET parent child1 value11 child2 value22

HINCRBY

String型にも、INCRBYというコマンドがあったが、
そちらとほとんど同様。フィールドの値が数値のときのみ使えるコマンド。
キーやフィールドがない場合は、0基準で加算が行われる。

参考【Redis基礎】汎用コマンドとString型について対応するコマンド

本記事では、Redisのデータ型のString型と、データ型に関わらない、汎用コマンドを解説します。 前回の記事では、Redis自体がどういうものなのかについて、解説したので、本記事では汎用コマンドや ...

続きを見る

HINCRBY parent child7 3
  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-インフラ