Table Of Contents

Previous topic

ソート済みセット型

Next topic

文字列のハック

This Page

ハッシュ型

Redisハッシュ型は順番がないRedis文字列型のフィールドと値のマップです。フィールドの追加、削除、確認をならしてO(1)で行うことができます。すべてのキー、値、またはその両方を一覧するのはO(N)で行うことができます。(Nはハッシュ内のフィールドの数です)

Redisハッシュ型は面白い作りになっています。どのような点が面白いかというと、オブジェクトを表現するのにとても適した形になっているところです。例えば、ウェブアプリケーションユーザはたとえばユーザ名、暗号化されたパスワード、最終ログイン時刻などのフィールドを持ったRedisハッシュで表現されます。

他のとても重要な機能として、少ないフィールド数で構築されたRedisハッシュは非常にメモリを使う量が少なく、すべてのフィールドをRedisキーの最上位レベルに刷るのと比べると一目瞭然です。(この値は設定可能です。詳細はredis.confを参考にしてください)

Redisハッシュはアプリケーションが以前あるフィールドが存在したかどうか警告するために便利な値を返すようにつくられています。たとえば HSET コマンドはフィールドがすでにハッシュ表の中にあった場合は 1 を、それ以外の場合は 0 を返すようにしています。(そしてユーザはこれは単に更新操作であることを知っている)

ハッシュが持てる最大数は 2^32 - 1 (4294967295, 1ハッシュあたり4億以上)です。

実装の詳細

Note

翻訳あやしい

Redisハッシュの内部表現は事実データ構造地震の名前が示すとおりハッシュ表となっています。この実装の欠点はハッシュ表のメタデータに多くの空間的オーバーヘッドがあるということです。

Redisハッシュの面白い使い方としてオブジェクトエンコーディングがあります。オブジェクトはしばしばいくつかのフィールドにより構成されます。Redisではそれぞれにオブジェクトに異なる内部的に小さなハッシュ(以下小ハッシュ)を持っています。(Redisはハッシュを小さくするために、この小ハッシュのフィールド数には上限を設けています。各フィールドと値は設定されたバイト数以下でなければなりません。これらはすべて設定可能です。)

したがって小ハッシュは zipmap と呼ばれるデータ構造を用いてエンコードされています。(zipmapはコンピュータサイエンス系の本を読んでも出てきません。Redis開発中に命名されました。)このデータ構造は非常にメモリを文字列を文字列に対応させるマッピングにおいてメモリを効率的に使う構造になっています。大抵の操作でO(1)ではなくO(N)になるという犠牲を払っても、メモリの低省を優先しました。 しかしこのデータ構造が普遍である時間は非常に短く、また大きくなった場合にはハッシュ表に変換されるため、Redisハッシュの操作をならすとO(1)にはなっているはずです。実際に小さなzipmapは効率的なローカルキャッシュに素早くアクセスできるため小さなハッシュ表よりも遅いということはありません。

結果として小ハッシュはメモリを効率的に使い、素早くアクセスでき、一方で大きなハッシュは早いけれどメモリ効率は小ハッシュよりも悪くなっています。

ハッシュ型のコマンド

HSET(key, field, value)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュの指定されたフィールド field に値 value をセットする。

キーが存在しない場合は、 fieldvalue のハッシュを持つ新しいキーが生成される。

フィールドがすでに存在する場合して、 HSET が値を更新しただけの場合は0が返ります。新しいフィールドが作成された場合は1が返ります。

帰り値

Integer replyが返ります。
HGET(key, field)

New in version 1.3.10.

計算時間: O(1)

もしキー key がハッシュを持っていた場合、指定したフィールド field に対応する値を取得します。

もしフィールドが見つからない場合、あるはキーが見つからない場合は、nilが返ります。

帰り値

Bulk replyを返します。
HSETNX(key, field, value)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュ内にフィールド field が存在しない場合、値 value をセットします。

キーが存在しない場合は、キーに対して fieldvalue の組を持った新しいハッシュが作成されます

もしフィールドがすでに存在する場合、この操作はなんの処理もせず0を返します。それ以外の場合はフィールド field に値 value をセットして1を返します。

帰り値

Integer replyを返します。
HMSET(key, field1, value1, ..., fieldN, valueN)

New in version 1.3.10.

計算時間: O(N) (Nはフィールドの数)

それぞれのフィールドにそれぞれの値をセットします。 HMSET では古い値を新しい値で置き換えます。

キーが存在しない場合は、指定したハッシュを持った新しいキーが作成されます。

帰り値

Status code replyが返ります。 HMSET は絶対に失敗しないので常に +OK が返ります。
HMGET(key, field1, ..., fieldN)

New in version 1.3.10.

計算時間: O(N) (Nはフィールドの数)

指定した複数のキー keyN に対応するハッシュ内のフィールド field に保持された値を取得します。

もし指定したキーの内いくつかが存在しない場合、nilが返ります。存在しないキーに関しては空のハッシュと同等に扱われます。

帰り値

Multi Bulk Replyが返ります。具体的には指定したそれぞれのフィールド fieldN に対する複数の値を持ったリストが返ります。値は指定したフィールドの順です。
HINCRBY(key, field, value)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュ内のフィールド field に保持されている値を value だけインクリメントします。キーが存在しない場合は filedvalue の組を持った新しいハッシュが作成されます。もしフィールドが存在しない、あるいは文字列を持っている場合は値は0となります。

HINCRBY で指定できる値の範囲は64bit符号付き整数の範囲内です。

値は符号付きなので、インクリメントにもデクリメントにも使えます。

HINCRBY key field 1 (increment by one)
HINCRBY key field -1 (decrement by one, just like the DECR command)
HINCRBY key field -10 (decrement by 10)

帰り値

Integer replyが返ります。インクリメント後の新しい値が返ります。
HEXISTS(key, field)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュ内に指定したフィールド field があれば1を返します。

もしキーあるいはフィールドが存在しない場合は0が返ります。

帰り値

Integer replyが返ります。
HDEL(key, field)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュ内のフィールド field を削除します。

もしフィールドがハッシュ内に存在する場合は、そのフィールドは削除され1が返ります。それ以外の場合は0が返り、なんの操作も行われません。

帰り値

Integer replyが返ります。
HLEN(key)

New in version 1.3.10.

計算時間: O(1)

キー key に対応するハッシュに存在するエントリ(フィールド)数を返します。もし指定したキーが存在しない場合は、空のハッシュと同様に0が返ります。

帰り値

Integer replyが返ります。
HKEYS(key)

New in version 1.3.10.

HVALS(key)

New in version 1.3.10.

HGETALL(key)

New in version 1.3.10.

計算時間: O(N), Nは要素数

HKEYS はキー key に対応するハッシュ内のすべてのフィールド名を返します。 HVALS はキー key に対応するハッシュ内の全ての値、 HGETALL はフィールドと値の組み合わせを field1, value1, field2, value2, ..., fieldN, valueNの形で返します。

帰り値

Multi Bulk Replyが返ります。