Redis ( 2 ) ~ データ構造 ~

September 11, 2017

Redis のデータ構造

インメモリのキーバリューストアである Redis は以下のデータ構造を扱うことができる。

  • STRING ( 文字列 ): 文字列、整数、浮動小数点数
  • LIST ( リスト ): 文字列の連結リスト
  • SET ( 集合 ): 一意な文字列の順序のないコレクション
  • HASH ( ハッシュ ): 順序のないキーと値のハッシュテーブル
  • ZSET ( ソート済み集合 ): 浮動小数点数のスコア順に並べられた文字列メンバーからスコアへのマッピング

と、説明してみたが、具体例を見た方が早いので、実際に使ってみる。

Redis の文字列

Redis で STRING を用いる場合は以下のコマンドが使える。

  • GET: 指定されたキーのもとで格納された値をフェッチする
  • SET: 指定されたキーのもとに値を設定する
  • DEL: 指定されたキーのもとに格納された値を削除する

実際に使ってみる。

$ redis-cli
127.0.0.1:6379> set hello world # hello キーに world 値を格納
OK
127.0.0.1:6379> get hello # hello キーの値を取得
"world"
127.0.0.1:6379> del hello # キーバリューペアを削除
(integer) 1
127.0.0.1:6379> get hello
(nil)

Redis のリスト

Redis で LIST を用いる場合は以下のコマンドが使える。

  • RPUSH: リストの右端に値を追加する
  • LRANGE: リストから指定した範囲の値をフェッチする
  • LINDEX: リストの指定した位置の要素をフェッチする
  • LPOP: リストの左端の値を削除して返す

実際に使ってみる。

127.0.0.1:6379> rpush list-key item # list-key に値 "item" を追加
(integer) 1
127.0.0.1:6379> rpush list-key item2 # list-key に値 "item2" を追加
(integer) 2
127.0.0.1:6379> rpush list-key item # list-key に値 "item" をさらに追加
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1 # 範囲を 0 -> -1 とするとリスト全体を取得
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lpop list-key # 左端の値を削除
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
127.0.0.1:6379> lrange list-key 0 1
1) "item2"
2) "item"

Redis の集合

LIST とは違い SET はハッシュを用いて全ての文字列が一意になる。 Redis で SET を用いる場合は以下のコマンドが使える。

  • SADD: 集合に要素を追加する
  • SMEMBERS: 集合に要素全体を返す
  • SISMEMBER: 要素が集合に含まれているかどうかをチェックする
  • SREM: 指定した要素が集合に含まれていれば、それを削除する

実際に使ってみる。

127.0.0.1:6379> sadd set-key item # 集合 "set-key" に "item" を追加
(integer) 1
127.0.0.1:6379> sadd set-key item2 # 集合 "set-key" に "item2" を追加
(integer) 1
127.0.0.1:6379> sadd set-key item3 # 集合 "set-key" に "item3" を追加
(integer) 1
127.0.0.1:6379> sadd set-key item # 集合 "set-key" に "item" を追加
(integer) 0
127.0.0.1:6379> smembers set-key # 集合 "set-key" に含まれる値を表示
1) "item"
2) "item3"
3) "item2"
127.0.0.1:6379> sismember set-key item # 集合 "set-key" に "item" が含まれるかチェック
(integer) 1
127.0.0.1:6379> sismember set-key item4 # 集合 "set-key" に "item4" が含まれるかチェック
(integer) 0
127.0.0.1:6379> srem set-key item2 # 集合 "set-key" から "item2" を削除
(integer) 1
127.0.0.1:6379> srem set-key item2 # 集合 "set-key" から "item2" を削除 ( 失敗 )
(integer) 0
127.0.0.1:6379> smembers set-key # 集合 "set-key" に含まれる値を表示
1) "item"
2) "item3"

Redis のハッシュ

Redis の HASH は、以下の図のようにキーから値へのマッピングそのものを格納する。

----- [ HASH: hash-key1 ] -----
sub-key1: value1
sub-key2: value2

----- [ HASH: hash-key2 ] -----
sub-key1: value1
sub-key2: value2

Redis で HASH を用いる場合は以下のコマンドが使える。

  • HSET: ハッシュの指定したキーのもとに値を格納する
  • HGET: 指定したハッシュキーの値をフェッチする
  • HGETALL: ハッシュ全体をフェッチする
  • HDEL: 指定したキーがハッシュに含まれていれば、それを削除する

実際に使ってみる。

127.0.0.1:6379> hset hash-key sub-key1 value1 # "hash-key" のもとで "sub-key1" "value1" ペアを格納
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2 # "hash-key" のもとで "sub-key2" "value2" ペアを格納
(integer) 1
127.0.0.1:6379> hset hash-key sub-key1 value1 # "hash-key" のもとで "sub-key1" "value1" ペアを格納 ( 失敗 )
(integer) 0
127.0.0.1:6379> hgetall hash-key # "hash-key" に含まれる要素を取得
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2 # "hash-key" 内の "sub-key2" に対応するキーバリューペアを削除
(integer) 1
127.0.0.1:6379> hdel hash-key sub-key2 # "hash-key" 内の "sub-key2" に対応するキーバリューペアを削除 ( 失敗 )
(integer) 0
127.0.0.1:6379> hget hash-key sub-key1 # "hash-key" 内の "sub-key1" に対応する値を取得
"value1"
127.0.0.1:6379> hgetall hash-key # "hash-key" に含まれる要素を取得
1) "sub-key1"
2) "value1"
127.0.0.1:6379> hset hash-key2 sub-key1 value1 # "hash-key2" のもとで "sub-key1" "value1" ペアを格納
(integer) 1
127.0.0.1:6379> hgetall hash-key2 # "hash-key2" に含まれる要素を取得
1) "sub-key1"
2) "value1"

Redis のソート済み集合

REDIS の ZSET はキーと値を持つ型であり、キー ( メンバー ) は一意で、値は不動小数点数だけに制限される。
ZSET はメンバーを指定してアクセスできるほか、ソートされた順序、スコアの値にでもアクセスが可能となる。

Redis で ZSET を用いる場合は以下のコマンドが使える。

  • ZADD: 指定したスコアを持つメンバーを ZSET に追加する
  • ZRANGE: ソートされた順序のなかでの位置に基づき、ZSET の要素 ( 複数可 ) をフェッチする
  • ZRANGEBYSCORE: 指定した範囲のスコアを持つ ZSET の要素 ( 複数可 ) をフェッチする
  • ZREM: 指定した要素が ZSET に含まれていれば、それを削除する

実際に使ってみる。

127.0.0.1:6379> zadd zset-key 728 member1 # "zset-key" にスコア 728 の member1 を追加
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0 # "zset-key" にスコア 982 の member0 を追加
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0 # "zset-key" にスコア 982 の member0 を追加 ( 失敗 )
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores # "zset-key" の要素を取得
1) "member1"
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores # "zset-key" のスコアが 0 ~ 800 までの要素を取得 
1) "member1"
2) "728"
127.0.0.1:6379> zrem zset-key member1 # "zset-key" から member1 を削除
(integer) 1
127.0.0.1:6379> zrem zset-key member1 # "zset-key" から member1 を削除 ( 失敗 )
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores # "zset-key" の要素を取得
1) "member0"
2) "982"

 © 2022, Dealing with Ambiguity