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"