พิมพ์จำนวนปุ่มใน Redis


164

มีวิธีพิมพ์จำนวนของคีย์ใน Redis หรือไม่?

ฉันรู้

keys *

แต่ดูเหมือนว่าน้ำหนักจะหนักเล็กน้อย - ระบุว่า Redis เป็นที่เก็บค่าคีย์บางทีนี่อาจเป็นวิธีเดียวที่จะทำได้ แต่ฉันยังต้องการเห็นบางสิ่งบางอย่างตามแนวของ

count keys *

4
มีคำขอดึงสำหรับ COUNT แต่ถูกปฏิเสธ github.com/antirez/redis/pull/32 antirez ยังแสดงความคิดเห็นกับ KEYS
Alex

ฉันสงสัยว่าพวกเขาไม่ได้รับการสนับสนุนเหมือนที่จะเป็น O (n) - เดาว่านี่เป็นการยืนยัน
Andy boot

คำตอบ:


199

คุณสามารถออกคำสั่ง INFO ซึ่งส่งคืนข้อมูลและสถิติเกี่ยวกับเซิร์ฟเวอร์ ดูที่นี่สำหรับตัวอย่างผลลัพธ์

ดังที่ได้กล่าวไว้ในความคิดเห็นโดย mVChr คุณสามารถใช้info keyspaceโดยตรงบน redis-cli


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

DBSIZE ส่งคืนหมายเลขของคีย์และแยกวิเคราะห์ได้ง่ายขึ้น

ข้อเสีย: หากคีย์หมดอายุอาจยังคงนับ

http://redis.io/commands/dbsize


3
ในตัวอย่างนั้นKEYS *แสดงคีย์ที่หมดอายุ นอกจากนี้ Redis อาจขับไล่ออกคีย์บางคีย์ที่หมดอายุไปแล้ว แต่ไม่จำเป็นต้องใช้ทั้งหมด
seppo0010

45

คำเตือน:อย่ารันสิ่งนี้กับเครื่องที่ใช้งานจริง

บนกล่อง Linux:

redis-cli KEYS "*" | wc -l

หมายเหตุ:ดังที่กล่าวไว้ในความคิดเห็นด้านล่างนี่เป็นการดำเนินการ O (N) ดังนั้นในฐานข้อมูลขนาดใหญ่ที่มีปุ่มจำนวนมากคุณไม่ควรใช้สิ่งนี้ สำหรับการปรับใช้ที่มีขนาดเล็กก็ควรจะใช้ได้


3
มีประโยชน์อย่างยิ่งและช่วยให้คุณสามารถกรองกุญแจได้เช่นกัน
Nick Farina

25
นั่นเป็นการดำเนินการ O (n) มีวิธีใดบ้างในการดำเนินการ O (1)?
Zoozy

21
อย่าใช้กับฐานข้อมูลขนาดใหญ่ในสภาพแวดล้อมการผลิต คำสั่งของ KEYS
Mantas

4
มีใครบางคนกำลังอ่านสิ่งนี้ทำสิ่งนี้ในกล่องผลิตบางวันโดยไม่ได้คิดถึงมันแล้วผลักมันข้ามขอบ ... อาจเกิดขึ้นแล้ว
Stu Thompson

2
สิ่งนี้ควรมีข้อจำกัดความรับผิดชอบที่จะใช้กับเซิร์ฟเวอร์ที่ไม่ได้ใช้งานจริงเท่านั้น มิฉะนั้นคุณควรใช้redis.io/commands/SCAN
whitfin



14

เนื่องจากรองรับ Redis 2.6, lua คุณสามารถรับคีย์ wildcard ได้เช่นนี้

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

ดูคำสั่ง eval


8
การใช้KEYSเพื่อนับกุญแจ (มีหรือไม่มีส่วนนำหน้า) ก็เหมือนกับการขว้างทารกออกไปพร้อมกับอาบน้ำ
Itamar Haber

1
สำหรับมือใหม่ Lua ที่: #ในรหัสนี้เป็นผู้ประกอบการมีความยาว
yzorg

4

dbsize() ส่งคืนจำนวนคีย์ทั้งหมด

คุณสามารถประมาณจำนวนของแป้นที่ตรงกับรูปแบบที่กำหนดได้อย่างรวดเร็วโดยการสุ่มตัวอย่างปุ่มแบบสุ่มจากนั้นตรวจสอบว่าเศษส่วนใดที่ตรงกับรูปแบบ

ตัวอย่างในไพ ธ อน การนับกุญแจทั้งหมดเริ่มต้นด้วย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

แม้จะช่วยให้การประมาณการที่ดีในกรณีของฉันยังมีความรวดเร็วเมื่อเทียบกับiter=100keys prefix_

การปรับปรุงคือการสุ่มตัวอย่างคีย์ 1,000 ตัวในทุกคำขอ แต่เก็บจำนวนทั้งหมดดังนั้นหลังจากสองคำขอคุณจะหารด้วย 2000 หลังจากสามคำขอคุณจะหารด้วย 3000 ดังนั้นหากใบสมัครของคุณสนใจจำนวนทั้งหมด ของการจับคู่คีย์ค่อนข้างบ่อยแล้วทุกครั้งที่มันจะเข้าใกล้และใกล้เคียงกับมูลค่าที่แท้จริง


1

หลังจาก Redis 2.6 ผลลัพธ์ของคำสั่ง INFO จะถูกแยกออกเป็นส่วน ๆ ในส่วน "keyspace" มีฟิลด์ "keys" และ "expired keys" เพื่อบอกจำนวนของปุ่มที่มี


4
สิ่งนี้ไม่ถูกต้อง นี่เป็นตัวอย่างเอาต์พุตของส่วน: # Keyspace db0: keys = 366, expires = 366 ที่นี่ 'keys' หมายถึงจำนวนรวมของคีย์และ 'expires' หมายถึงไม่มีคีย์พร้อมชุดหมดอายุ เป็นหลักก็หมายความว่าพวกเขามีชุด ttl และพวกเขาถูกกำหนดให้หมดอายุไม่ใช่ว่าพวกเขาหมดอายุ
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.