2013-05-22 4 views
6

私はRedisでハッシュを使ってオブジェクトを保存しています。私はRedisの観点からこれらのハッシュの長さを計算したいと思います。Redisハッシュの長さを取得するには?

これは、STRLENを使用している文字列に対して簡単に行うことができます。

しかし、私は単純にdocumentationのハッシュデータタイプに適したコマンドを見つけることができません。それはリストやセットの場合と同じようです。

私が見つけた唯一の解決策は、HGETALLでハッシュ全体を取得し、クライアントサイズの長さを計算することです。

完全に箱から出ているのですか?

私が間違っている場合は、理由を説明したり、関連リンク/投稿/ SOの質問を投稿したりしてください。

編集

HLENは、それが「ハッシュに含まれるフィールドの数を返す」ためのソリューションではありません。 容量計画でこのサイズを計算する& Redisデータベースでのアクティブな監視。

+0

あなたはこれを望む理由を説明できますか?それはredisのメモリ使用量を見積もることですか?あるいは、特定の機能を実装する必要がありますか? 'redisの観点からハッシュの長さ 'を見つける方法はありますが、ユースケースによっては有用かもしれません。 –

答えて

7

ディスクスペースとしての長さは、DEBUG OBJECTを使用できます。これは、各キーにいくつかの情報項目を戻すためです。

redis 127.0.0.1:50001> hset myhash field1 'hello' 
(integer) 1 
redis 127.0.0.1:50001> hset myhash field2 'world' 
(integer) 1 
redis 127.0.0.1:50001> DEBUG OBJECT myhash 
Value at:0x7fb8de4ad590 refcount:1 encoding:zipmap serializedlength:31 lru:696871 lru_seconds_idle:0 

は、それが

+1

そのオブジェクトは何バイト使用されますか?私は 'シリアル化された長さ' 31を理解していない? –

4

ハッシュの長さによって何をしたいかによって異なります。

長さを消費しているメモリを見つけるなどの診断や監視をしたい場合は、redis-rdb-toolsのようなツールを使ってオフラインで行うことをお勧めします。 CSVダンプファイルは、合計サイズ、消費された総メモリなど、各キーに関する統計を取得します。

しかし、サイズにアプリケーション機能を実装したい場合は、レディメイドのソリューションはありません。長さのHGETALLプラスクライアントサイズの計算は行く方法です。おそらく長さの計算がredisサーバ自体で行われるようにluaスクリプトを書くことによって最適化することができます。

+0

Downvoter - これはなぜdownvotedされたコメントを残してくださいできますか?私はdownvoteを気にしないが、私が間違って逃したか分からないことを知っているだろう:) –

+0

私はあなたを賞賛しなかったが、あなたの素晴らしいツールredis-rdb-toolsをupvotedしなかった。 – Cybermaxs

+0

@SripathiKrishnan「Redisハッシュ長を取得する方法」への明白な答えがHLENですが、明らかにOPは質問のハッシュの「長さ」以外の何かを意味していたので、あなたの答えは実際に良好です。私はdownvoteを削除したいと思いますが、あなたが何とかあなたの答えを編集しない限り、SOは私をもう許可しません。あなたがしたら、私はそれを削除することを嬉しく思います:)。 – Eli

23

HLENを使用してください。

redis> HSET myhash field1 "Hello" 
(integer) 1 
redis> HSET myhash field2 "World" 
(integer) 1 
redis> HLEN myhash 
(integer) 2 

EDIT:質問はOPがアクティブな監視のためのハッシュのディスク上のサイズを望んでいることであることを明らかにしました。その場合、私は間違いなくあなたのサーバー上のハッシュのサイズを計算し、あなたに戻って値を返すLuaスクリプトに行くだろう。 大きなハッシュが必要な場合はHGETALLを使用しないでください。ハッシュ全体をサーバーからクライアントコンピュータに転送する必要があります。そのため、実際にボトルネックになってしまいます。 Luaを使ってRedisサーバでこの計算を行うだけでは、ハッシュ全体のデータのmbではなく、ネットワークのバイト数のintを転送するだけです。

+0

私が前に言ったように、HLENはあなたの投稿のどこにでもHLENを言及したことのない、ハッシュのためのフィールドの数だけを返します。 – Cybermaxs

+2

@ Cyber​​maxs-Betclicハッシュの長さはフィールド(キー)の数です。そうでない場合は、どのくらいの長さを言いますか?他の言語では、len(ハッシュ)のようなことをすると、返されると予想されることです。 – Eli

+0

ああ、それは本当です。 HLEN "キーに格納されたハッシュに含まれるフィールドの数を返します";長さではなく、あなたがハッシュ全体のサイズを好むならば。 – Cybermaxs

0

はあなたの最善の策は、あなたがフィールドを取得し、それらのそれぞれのHSTRLENを合計するハッシュに遭遇したときにHSCANを用いることであろうようですお役に立てば幸いです。

関連する問題