มีวิธีพิมพ์จำนวนของคีย์ใน Redis หรือไม่?
ฉันรู้
keys *
แต่ดูเหมือนว่าน้ำหนักจะหนักเล็กน้อย - ระบุว่า Redis เป็นที่เก็บค่าคีย์บางทีนี่อาจเป็นวิธีเดียวที่จะทำได้ แต่ฉันยังต้องการเห็นบางสิ่งบางอย่างตามแนวของ
count keys *
มีวิธีพิมพ์จำนวนของคีย์ใน Redis หรือไม่?
ฉันรู้
keys *
แต่ดูเหมือนว่าน้ำหนักจะหนักเล็กน้อย - ระบุว่า Redis เป็นที่เก็บค่าคีย์บางทีนี่อาจเป็นวิธีเดียวที่จะทำได้ แต่ฉันยังต้องการเห็นบางสิ่งบางอย่างตามแนวของ
count keys *
คำตอบ:
คุณสามารถออกคำสั่ง INFO ซึ่งส่งคืนข้อมูลและสถิติเกี่ยวกับเซิร์ฟเวอร์ ดูที่นี่สำหรับตัวอย่างผลลัพธ์
ดังที่ได้กล่าวไว้ในความคิดเห็นโดย mVChr คุณสามารถใช้info keyspace
โดยตรงบน redis-cli
redis-cli INFO Keyspace | grep ^db
DBSIZE
ส่งคืนหมายเลขของคีย์และแยกวิเคราะห์ได้ง่ายขึ้น
ข้อเสีย: หากคีย์หมดอายุอาจยังคงนับ
KEYS *
แสดงคีย์ที่หมดอายุ นอกจากนี้ Redis อาจขับไล่ออกคีย์บางคีย์ที่หมดอายุไปแล้ว แต่ไม่จำเป็นต้องใช้ทั้งหมด
คำเตือน:อย่ารันสิ่งนี้กับเครื่องที่ใช้งานจริง
บนกล่อง Linux:
redis-cli KEYS "*" | wc -l
หมายเหตุ:ดังที่กล่าวไว้ในความคิดเห็นด้านล่างนี่เป็นการดำเนินการ O (N) ดังนั้นในฐานข้อมูลขนาดใหญ่ที่มีปุ่มจำนวนมากคุณไม่ควรใช้สิ่งนี้ สำหรับการปรับใช้ที่มีขนาดเล็กก็ควรจะใช้ได้
สำหรับการนับจำนวนปุ่มทั้งหมดให้ใช้คำสั่งด้านล่าง:
127.0.0.1:6379> DBSIZE
ใช้DBSIZE
สิ่งนี้จะทำให้คุณไม่มีกุญแจ
ส่งคืนจำนวนของคีย์ในฐานข้อมูลที่เลือกในปัจจุบัน
เพื่ออ่านเพิ่มเติมhttp://redis.io/commands/dbsize
เนื่องจากรองรับ Redis 2.6, lua คุณสามารถรับคีย์ wildcard ได้เช่นนี้
eval "return #redis.call('keys', 'prefix-*')" 0
KEYS
เพื่อนับกุญแจ (มีหรือไม่มีส่วนนำหน้า) ก็เหมือนกับการขว้างทารกออกไปพร้อมกับอาบน้ำ
#
ในรหัสนี้เป็นผู้ประกอบการมีความยาว
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=100
keys prefix_
การปรับปรุงคือการสุ่มตัวอย่างคีย์ 1,000 ตัวในทุกคำขอ แต่เก็บจำนวนทั้งหมดดังนั้นหลังจากสองคำขอคุณจะหารด้วย 2000 หลังจากสามคำขอคุณจะหารด้วย 3000 ดังนั้นหากใบสมัครของคุณสนใจจำนวนทั้งหมด ของการจับคู่คีย์ค่อนข้างบ่อยแล้วทุกครั้งที่มันจะเข้าใกล้และใกล้เคียงกับมูลค่าที่แท้จริง
หลังจาก Redis 2.6 ผลลัพธ์ของคำสั่ง INFO จะถูกแยกออกเป็นส่วน ๆ ในส่วน "keyspace" มีฟิลด์ "keys" และ "expired keys" เพื่อบอกจำนวนของปุ่มที่มี
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