Cetak jumlah kunci dalam Redis

164

Apakah ada cara untuk mencetak jumlah kunci di Redis?

saya sadar atas

keys *

Namun bobotnya sepertinya agak berat. - Mengingat bahwa Redis adalah toko nilai kunci mungkin ini adalah satu-satunya cara untuk melakukannya. Tapi aku masih ingin melihat sesuatu seperti itu

count keys *
andy boot
sumber
4
Ada permintaan tarik untuk COUNT, namun ditolak. github.com/antirez/redis/pull/32 antirez juga mengomentari KEYS
Alex
Saya bertanya-tanya apakah mereka tidak mendukungnya karena itu O (n) - coba tebak ini menegaskannya.
andy boot

Jawaban:

199

Anda dapat mengeluarkan perintah INFO, yang mengembalikan informasi dan statistik tentang server. Lihat di sini untuk contoh keluaran.

Seperti disebutkan dalam komentar oleh mVChr, Anda dapat menggunakan info keyspacelangsung pada redis-cli.

timun
sumber
1
redis-cli INFO Keyspace | grep ^db
Hackaholic
164

DBSIZE mengembalikan jumlah kunci dan lebih mudah untuk diuraikan.

Kelemahan: jika kunci telah kedaluwarsa, mungkin masih dihitung.

http://redis.io/commands/dbsize

seppo0010
sumber
3
Dalam contoh itu, KEYS *usir kunci yang kadaluarsa. Redis juga dapat secara aktif mengusir beberapa kunci kedaluwarsa, tetapi tidak harus semuanya.
seppo0010
45

PERINGATAN: Jangan jalankan ini di mesin produksi.

Di kotak Linux:

redis-cli KEYS "*" | wc -l

Catatan: Seperti disebutkan dalam komentar di bawah, ini adalah operasi O (N), jadi pada DB besar dengan banyak kunci Anda tidak boleh menggunakan ini. Untuk penyebaran yang lebih kecil, itu harus baik-baik saja.

reptilicus
sumber
3
Sangat berguna, dan memungkinkan Anda memfilter tombol juga.
Nick Farina
25
Itu operasi O (n), apakah ada cara untuk melakukan ini di O (1)?
Zoozy
21
Jangan gunakan pada database besar di lingkungan produksi. Command KEYS
Mantas
4
Seseorang akan membaca ini, melakukan ini pada kotak produksi suatu hari tanpa memikirkannya dan kemudian mendorongnya ... mungkin sudah terjadi.
Stu Thompson
2
Ini harus memiliki penafian untuk hanya digunakan pada server non-produksi. Kalau tidak, Anda harus menggunakan redis.io/commands/SCAN
whitfin
40

Untuk mendapatkan jumlah total kunci, gunakan perintah di bawah ini:

127.0.0.1:6379> DBSIZE
Pankaj Chauhan
sumber
24

gunakan DBSIZE ini tidak akan memberi Anda kunci

Kembalikan jumlah kunci dalam database yang saat ini dipilih.

untuk membaca lebih lanjut http://redis.io/commands/dbsize

Saurabh Chandra Patel
sumber
14

Sejak Redis 2.6, lua didukung, Anda bisa mendapatkan sejumlah kunci wildcard seperti ini

eval "return #redis.call('keys', 'prefix-*')" 0

lihat perintah eval

jingchao
sumber
8
Menggunakan KEYSuntuk menghitung kunci (dengan atau tanpa awalan) seperti membuang bayi keluar dengan air mandi.
Itamar Haber
1
Untuk pemula Lua: #dalam kode ini adalah operator panjang .
yzorg
4

dbsize() mengembalikan jumlah kunci.

Anda dapat dengan cepat memperkirakan jumlah kunci yang cocok dengan pola yang diberikan dengan mengambil sampel kunci secara acak, lalu memeriksa fraksi mana yang cocok dengan pola tersebut.

Contoh dalam python; menghitung semua kunci dimulai dengan prefix_:

import redis
r = redis.StrictRedis(host = 'localhost', port=6379)
iter=1000
print 'Approximately', r.dbsize() * float(sum([r.randomkey().startswith('prefix_') for i in xrange(iter)])) / iter

Bahkan iter=100memberikan perkiraan yang layak dalam kasus saya, namun sangat cepat, dibandingkan dengan keys prefix_.

Perbaikan adalah untuk sampel 1000 kunci pada setiap permintaan, tetapi pertahankan jumlah total, sehingga setelah dua permintaan Anda akan membagi dengan 2000, setelah tiga permintaan Anda akan membagi dengan 3.000. Dengan demikian, jika aplikasi Anda tertarik pada jumlah total kunci yang cocok cukup sering, maka setiap kali akan semakin dekat dan semakin dekat dengan nilai sebenarnya.

osa
sumber
1

Setelah Redis 2.6, hasil dari perintah INFO dipisahkan oleh bagian-bagian. Di bagian "keyspace", ada bidang "keys" dan "expired keys" untuk mengetahui berapa banyak kunci yang ada.

Jiankuan Xing
sumber
4
Ini tidak benar. Ini adalah contoh keluaran dari bagian ini: # Keyspace db0: keys = 366, kedaluwarsa = 366 Di sini, 'kunci' menunjukkan total tidak ada kunci dan 'kedaluwarsa' menunjukkan tidak ada kunci dengan set kedaluwarsa. Pada dasarnya itu berarti bahwa mereka memiliki satu set ttl dan mereka ditetapkan untuk kedaluwarsa, bukan bahwa mereka telah kedaluwarsa.
s1d
-1
eval "local count = redis.call('scan', 0, 'match', 'key:*:key', 'count', 10000) if count ~= 0 then return #count[2] end " 0

eval "local count = redis.call('sscan', 'key.key:all', 0, 'match', '*', 'count', 1000000) if count ~= 0 then return #count[2] end " 0
Laoch Tan
sumber