สั่งคำสั่งใหม่เพื่อรับกุญแจที่มีทั้งหมดหรือไม่


502

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

คำตอบ:


721

ลองดูKEYSคำสั่ง KEYS *จะแสดงรายการคีย์ทั้งหมดที่เก็บไว้ใน Redis

แก้ไข:โปรดทราบคำเตือนที่ด้านบนของKEYSหน้าเอกสาร:

ความซับซ้อนของเวลา: O (N) โดยที่ N เป็นจำนวนคีย์ในฐานข้อมูลภายใต้สมมติฐานว่าชื่อคีย์ในฐานข้อมูลและรูปแบบที่กำหนดมีความยาว จำกัด

UPDATE (V2.8 หรือสูงกว่า): SCANเป็นทางเลือกที่เหนือกว่าKEYSในแง่ที่ว่ามันไม่ได้บล็อกเซิร์ฟเวอร์หรือไม่ใช้ทรัพยากรที่สำคัญ ชอบใช้มัน


96
ตัวอย่างการใช้งานของ CLI:redis-cli keys "*"
XåpplI'-I0llwlg'I -

4
การแก้ไข: คำสั่ง redis ทั้งหมดเป็นแบบเธรดเดียวและจะบล็อกเซิร์ฟเวอร์ ข้อแตกต่างเพียงอย่างเดียวคือKEYSมีศักยภาพในการบล็อกเซิร์ฟเวอร์ได้นานขึ้นเมื่อทำการสืบค้นชุดข้อมูลขนาดใหญ่
Leo

155

อัพเดตสำหรับ Redis 2.8 และสูงกว่า

ดังที่ระบุไว้ในความคิดเห็นของคำตอบก่อนหน้าสำหรับคำถามKEYSนี้เป็นคำสั่งที่อาจเป็นอันตรายเนื่องจากเซิร์ฟเวอร์ Redis ของคุณจะไม่สามารถทำการดำเนินการอื่น ๆ ในขณะที่ให้บริการ ความเสี่ยงอีกอย่างKEYSคือมันสามารถใช้งานได้ (ขึ้นอยู่กับขนาดของพื้นที่คีย์ของคุณ) RAM จำนวนมากเพื่อเตรียมบัฟเฟอร์การตอบสนองซึ่งอาจทำให้หน่วยความจำของเซิร์ฟเวอร์ของคุณหมดลง

Redis เวอร์ชัน 2.8 ได้เปิดตัวคำสั่งตระกูลSCANที่มีความสุภาพมากกว่าและสามารถใช้เพื่อจุดประสงค์เดียวกันได้

CLI ยังเป็นวิธีที่ดีในการทำงานกับมัน:

$ redis-cli --scan --pattern '*'

59

อาจเกิดขึ้นได้โดยใช้ redis-cli คุณเชื่อมต่อกับเซิร์ฟเวอร์ redis ระยะไกลของคุณแล้วคำสั่ง:

KEYS *

ไม่แสดงอะไรเลยหรือดีกว่าแสดงว่า:
(empty list or set)

หากคุณแน่ใจอย่างแน่นอนว่าเซิร์ฟเวอร์ Redis ที่คุณใช้เป็นเซิร์ฟเวอร์ที่คุณมีข้อมูลบางที Redis-cli ของคุณอาจไม่ได้เชื่อมต่อกับอินสแตนซ์ฐานข้อมูล Redis ที่ถูกต้อง

ในฐานะที่เป็นที่กล่าวถึงในเอกสาร Redis, การเชื่อมต่อใหม่เชื่อมต่อเป็นค่าเริ่มต้นไปยังฐานข้อมูล 0

ในกรณีของKEYSคำสั่งไม่ได้เรียกผลเนื่องจากฐานข้อมูลของฉันคือ 1. ในการสั่งซื้อเพื่อเลือกฐานข้อมูลที่คุณต้องการใช้SELECT
db ถูกระบุโดยจำนวนเต็ม

SELECT 1
KEYS *

ฉันโพสต์ข้อมูลนี้เพราะไม่มีคำตอบก่อนหน้านี้ที่แก้ไขปัญหาของฉัน


31

-> รับกุญแจทั้งหมดจาก redis-cli

-redis 127.0.0.1:6379> keys *

-> รับรายการรูปแบบ

-redis 127.0.0.1:6379> keys d??

สิ่งนี้จะสร้างคีย์ที่เริ่มต้นด้วย 'd' ด้วยอักขระสามตัว

-redis 127.0.0.1:6379> keys *t*

สิ่งนี้จะได้รับกุญแจที่มีตัวอักษร 't' ตรงกันในคีย์

-> นับกุญแจจากบรรทัดคำสั่งโดย

-redis-cli keys * |wc -l

-> หรือคุณสามารถใช้ dbsize

-redis-cli dbsize

เพียงคัดลอกคำตอบแล้วลอง มันให้ "คำสั่งที่ไม่รู้จัก 'สำคัญ'" "key" ไม่ใช่คำสั่ง "keys" คือ โปรดที่ถูกต้องที่จะkey *t* keys *t*
Kunal Dethe

ขอบคุณครับสำหรับข้อมูลนั้นมันเป็นความผิดพลาดของฉันในปัจจุบันฉันอยู่บนมือถือฉันจะเปลี่ยนคำสั่งนั้นล่วงหน้า
denny

แผ่นชีทที่มีประโยชน์มากสิ่งนี้
Hassan Baig

19

ลองดูที่ต่อไปนี้แผ่น Redis โกง ในการรับชุดย่อยของคีย์ redis ด้วย redis-cli i ให้ใช้คำสั่ง

KEYS "prefix:*"

6

ใช่คุณสามารถรับกุญแจทั้งหมดได้โดยใช้สิ่งนี้

var redis = require('redis');
redisClient = redis.createClient(redis.port, redis.host);    
  redisClient.keys('*example*', function (err, keys) {
})

4
ไม่ใช่สิ่งที่ OP ต้องการ (Redis-cli) แต่ขอบคุณที่ชี้ให้เห็น
Herick

4

SCAN ไม่ต้องการให้ไคลเอนต์โหลดคีย์ทั้งหมดลงในหน่วยความจำอย่างที่ KEYS ทำ SCAN ให้ตัววนซ้ำที่คุณสามารถใช้ได้ ฉันมีระเบียน 1B ใน redis ของฉันและฉันไม่สามารถได้รับหน่วยความจำเพียงพอที่จะคืนกุญแจทั้งหมดในครั้งเดียว

นี่คือตัวอย่างข้อมูลของไพ ธ อนเพื่อรับคีย์ทั้งหมดจากร้านค้าที่ตรงกับรูปแบบและลบทิ้ง:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("key_pattern*"):
    print key


3

รูปแบบของ KEYS

มีให้ตั้งแต่ 1.0.0

ความซับซ้อนของเวลา: O (N) โดยที่ N เป็นจำนวนคีย์ในฐานข้อมูลภายใต้สมมติฐานว่าชื่อคีย์ในฐานข้อมูลและรูปแบบที่กำหนดมีความยาว จำกัด

ส่งคืนรูปแบบการจับคู่คีย์ทั้งหมด

คำเตือน:ไม่แนะนำให้ใช้คำสั่งนี้เนื่องจากอาจทำให้ประสิทธิภาพลดลงเมื่อดำเนินการกับฐานข้อมูลขนาดใหญ่แทน KEYS คุณสามารถใช้SCANหรือSETSชุด

ตัวอย่างคำสั่งของ KEYS ที่จะใช้:

redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "lastname"
2) "firstname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "lastname"
2) "age"
3) "firstname"

1

หาก Redis ของคุณเป็นคลัสเตอร์คุณสามารถใช้สคริปต์นี้

#!/usr/bin/env bash
redis_list=("172.23.3.19:7001,172.23.3.19:7002,172.23.3.19:7003,172.23.3.19:7004,172.23.3.19:7005,172.23.3.19:7006")

arr=($(echo "$redis_list" | tr ',' '\n'))

for info in ${arr[@]}; do
  echo "start :${info}"
  redis_info=($(echo "$info" | tr ':' '\n'))
  ip=${redis_info[0]}
  port=${redis_info[1]}
  echo "ip="${ip}",port="${port}
  redis-cli -c -h $ip -p $port set laker$port '湖人总冠军'
  redis-cli -c -h $ip -p $port keys \*

done

echo "end"

1

รับกุญแจทั้งหมดใน Redis

รับกุญแจทั้งหมดโดยใช้ตัวเลือก - สแกน:

$ redis-cli --scan --pattern '*'

แสดงรายการคีย์ทั้งหมดโดยใช้คำสั่ง KEYS:

$ redis-cli KEYS '*'

0

ในการรับคีย์ทั้งหมดที่มีอยู่ในเซิร์ฟเวอร์ redis คุณควรเปิด redis-cli และประเภท: KEYS * เพื่อรับความช่วยเหลือเพิ่มเติมโปรดไปที่หน้านี้: ลิงค์นี้



0

หากคุณใช้ Laravel Framework คุณก็สามารถใช้สิ่งนี้:

$allKeyList = Redis::KEYS("*");

print_r($allKeyList);

ใน Core PHP:

$redis = new Redis();

$redis->connect('hostname', 6379);

$allKeyList = $redis->keys('*');

print_r($allKeyList);

0

คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ redis ของคุณโดยใช้ redis-cli เลือกฐานข้อมูลของคุณและพิมพ์ KEYS * โปรดจำไว้ว่ามันจะให้คีย์ทั้งหมดที่มีอยู่ในฐานข้อมูล redis ที่เลือก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.