2013-05-22 17 views
6

Memorizzo gli oggetti usando gli hash su Redis e vorrei calcolare la lunghezza di questi Hash dal punto di vista di Redis.Come ottenere la lunghezza di hash di Redis?

È possibile eseguire questa operazione facilmente per le stringhe utilizzando STRLEN.

Ma semplicemente non riesco a trovare un comando adatto per il tipo di dati hash nel documentation. Sembra essere la stessa cosa per liste o set.

Fondamentalmente, l'unica soluzione che ho trovato è ottenere l'intero hash con HGETALL e calcolare la lunghezza sulla dimensione del client.

Is è qualcosa di completamente fuori dalla scatola?

Se ho torto, per favore non esitare a spiegarmi perché o darmi link pertinenti/post/domande SO.

Edit:

HLEN non è una soluzione, perché "Restituisce il numero di campi contenuti nella hash". Desidero calcolare questa dimensione per Pianificazione capacità & Monitoraggio attivo nel database Redis.

+0

Puoi spiegare perché lo vuoi?E 'per stimare l'utilizzo della memoria su redis? O hai bisogno di implementare una particolare funzionalità? Ci sono modi per scoprire il punto di vista "lunghezza dell'hash da redis", ma può essere utile o meno a seconda del tuo caso d'uso. –

risposta

7

Per la lunghezza come spazio su disco è possibile utilizzare DEBUG OBJECT in quanto restituisce diverse informazioni per ogni chiave.

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 

Speranza che aiuta

+1

Quindi quanti byte occupa quell'oggetto? Non capisco "lunghezza serializzata" 31? –

4

Dipende da cosa si vuole fare con la lunghezza dell'hash.

Se si desidera che la lunghezza esegua alcune operazioni di diagnostica o monitoraggio, come la ricerca della memoria consumata, suggerirei di farlo offline utilizzando uno strumento come redis-rdb-tools. Il file di csv dump ti fornirà statistiche su ogni chiave, incluse le dimensioni totali, la memoria totale consumata e così via.

Ma se si desidera che le dimensioni implementino alcune funzionalità dell'applicazione, non esiste una soluzione già pronta. HGETALL più il calcolo della lunghezza del client della lunghezza è la strada da percorrere. Potresti forse ottimizzare scrivendo uno script lua in modo che il calcolo della lunghezza avvenga sul server redis stesso.

+0

Downvoter - puoi lasciare un commento perché è stato downvoted? Non mi dispiace il downvote, ma mi piacerebbe sapere cosa ho perso o dichiarato in modo errato :) –

+0

Non ho downvoted te ma upvoted per il tuo grande strumento redis-rdb-tools. – Cybermaxs

+0

@SripathiKrishnan Ho downvoted perché la risposta ovvia a "come ottenere l'hash redis length" è HLEN, ma a quanto pare l'OP ha significato qualcosa di diverso dalla "lunghezza" dell'hash nella sua domanda, quindi la tua risposta è effettivamente buona. Rimuoverò il downvote, ma SO non mi lascerà più a meno che tu non modifichi la tua risposta in qualche modo. Se lo fai, sarei felice di rimuoverlo :). – Eli

23

Basta usare HLEN.

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

EDIT: La questione è stata chiarita per essere che il PO vuole la dimensione su disco di un hash per il monitoraggio attivo. In tal caso, sceglierei uno script Lua che calcola la dimensione di un hash sul server e restituisce il valore a te. Non utilizzare lo standard HGETALL se si prevedono grossi hash, poiché è necessario trasferire l'intero hash dal server al computer client e questo diventerà il collo di bottiglia molto rapidamente. Fare questo calcolo sul server Redis con Lua significa semplicemente trasferire un numero intero di byte della rete invece di possibilmente mb di dati per l'intero hash.

+0

Come ho detto prima, HLEN restituisce solo il numero di campi per un hash – Cybermaxs

+2

@ Cybermaxs-Betclic che non hai mai menzionato HLEN ovunque nel tuo post. E la lunghezza di un hash è il numero di campi (chiavi). A che lunghezza ti riferisci se non quello? In qualsiasi altra lingua, quando fai qualcosa come len (hash), è quello che ti aspetti di aver restituito. – Eli

+0

Oh è vero. HLEN "Restituisce il numero di campi contenuti nell'hash memorizzato nella chiave"; non la lunghezza o se preferisci la dimensione dell'intero hash. – Cybermaxs

0

Sembra la soluzione migliore sarebbe quella di utilizzare HSCAN quando si incontra un hash per ottenere i campi e riassumere HSTRLEN per ciascuno di essi.

Problemi correlati