รับคีย์ทั้งหมดที่ตั้งค่าไว้ใน memcached


132

ฉันจะตั้งค่าคีย์ทั้งหมดในอินสแตนซ์ memcached ของฉันได้อย่างไร

ฉันลองใช้ googling แต่ไม่พบอะไรมากนักยกเว้นที่PHPรองรับไฟล์getAllKeysวิธีการซึ่งหมายความว่ามันเป็นไปได้ที่จะทำเช่นนี้จริงๆ ฉันจะได้รับสิ่งเดียวกันภายในเซสชัน Telnet ได้อย่างไร

ฉันได้ลองใช้ตัวเลือกที่เกี่ยวข้องกับการดึงข้อมูลทั้งหมดที่กล่าวถึงในแผ่นโกง memcachedและสรุปคำสั่ง Memcached telnetแล้ว แต่ไม่มีตัวเลือกใดที่ใช้งานได้และฉันไม่สามารถหาวิธีที่ถูกต้องในการทำเช่นนี้ได้

หมายเหตุ: ขณะนี้ฉันกำลังดำเนินการพัฒนาดังนั้นจึงสามารถสันนิษฐานได้ว่าจะไม่มีปัญหาใด ๆ เนื่องจากมีการตั้งค่าคีย์ใหม่หรือเงื่อนไขการแข่งขันอื่น ๆ ที่เกิดขึ้นและจำนวนคีย์จะถูก จำกัด ด้วย


ตรวจสอบของฉันโพสต์ ฉันมีปัญหาเดียวกันและพบวิธีแก้ปัญหา
Peter VARGA

github.com/clickalicious/phpmemadminดูมีประโยชน์ (ถ้าฉันสามารถหาวิธีทำให้มันทำงานกับ Laravel Homestead Vagrant ได้ขณะนี้ไม่แสดงคีย์)
Ryan

คำตอบ:


179

พบวิธีขอบคุณลิงค์ที่นี่ (พร้อมการสนทนากลุ่มเดิมของGoogle ที่นี่ )

ขั้นแรกTelnetไปยังเซิร์ฟเวอร์ของคุณ:

telnet 127.0.0.1 11211

จากนั้นแสดงรายการเพื่อรับรหัสพื้น:

รายการสถิติ
STAT รายการ: 3: หมายเลข 1
รายการ STAT: 3: อายุ 498 ปี
STAT items: 22: หมายเลข 1
รายการ STAT: 22: อายุ 498 ปี
END

ตัวเลขแรกหลัง "items" คือรหัสพื้น ขอแคชดัมพ์สำหรับแต่ละรหัสพื้นโดย จำกัด จำนวนคีย์สูงสุดที่จะดัมพ์:

สถิติ cachedump 3 100
มุมมอง ITEM.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 วินาที]
END

สถิติ cachedump 22100
มุมมอง ITEM.decorators.cache.cache_page..8427e [7736 b; 1256056128 วินาที]
END


4
โปรดทราบว่า stats cachedump เป็นฟีเจอร์ที่ไม่มีเอกสารและทีม memcached ไม่รองรับ มีไว้สำหรับการดีบักเท่านั้นและไม่ได้มีไว้สำหรับการใช้งานจริง
mikewied

โอวตกลง. อย่างที่ฉันพูดในคำถามของฉันตอนนี้ฉันอยู่ในโหมดการพัฒนาเท่านั้นและต้องการสิ่งนั้นสำหรับการดีบัก
.

3
bเป็นไบต์sเป็นช่วงเวลาวินาที
อับราฮัมสังฆะ

1
@ แดนบางทีคุณอาจกำลังดูคำตอบที่ใช้งานอยู่ก่อนซึ่งจะเรียงลำดับโพสต์คำตอบตามเวลาที่พวกเขามีกิจกรรมล่าสุด ถ้าใช่คุณสามารถเปลี่ยนแปลงได้โดยเลือกหนึ่งในคะแนนที่ใช้งานอยู่ / เก่าแก่ที่สุด / โหวตจากด้านล่างข้อความคำถาม นอกเหนือจากนั้นคำตอบนี้จะอยู่ด้านบนสุดในโหมดไม่ระบุตัวตน
.

2
นอกจากนี้ยังมีlru_crawler metadump allที่จะทิ้งคีย์แคชทั้งหมดไม่ใช่ "แค่" 1M แรก .. github.com/memcached/memcached/blob/…
Kaos

65

memdump

มีคำสั่งmemcdump(บางครั้งmemdump) สำหรับสิ่งนั้น (บางส่วนlibmemcached-tools) เช่น:

memcdump --servers=localhost

ซึ่งจะส่งคืนคีย์ทั้งหมด


memcached-tool

ในเวอร์ชันล่าสุดmemcachedยังมีmemcached-toolคำสั่งเช่น

memcached-tool localhost:11211 dump | less

ซึ่งทิ้งคีย์และค่าทั้งหมด

ดูสิ่งนี้ด้วย:


4
ระวังด้วย 'memdump' คำสั่งนี้เป็นวิธีที่ดีในการทำให้เทอร์มินัลของคุณพัง
deweydb

5
ระวัง! dumpคำสั่งย่อยสำหรับmemcached-toolดูเหมือนว่าจะล้างออกแคช :( --might จะมีความปลอดภัยในการใช้งานdisplayหรือstatsครั้งแรก.
MarkHu

4
ใน Ubuntu Xenial จะเรียกแพ็คเกจที่มี memdump libmemcached-toolsและไบนารีของเครื่องมือเรียกว่า memcdump แทน
thenickdude

5
สำหรับผู้ที่มองหาmemcached-toolมันค่อนข้างซ่อนอยู่ในไดเรกทอรีซึ่งอาจไม่อยู่ในมาตรฐานPATH- อย่างน้อยบน Ubuntu Xenial - ที่นี่:/usr/share/memcached/scripts/
sxc731

17

ฐาน@mu 無ตอบที่นี่ ฉันเขียนสคริปต์การถ่ายโอนข้อมูลแคช

สคริปต์จะทิ้งเนื้อหาทั้งหมดของเซิร์ฟเวอร์ memcached ได้รับการทดสอบกับ Ubuntu 12.04 และ memcached localhost ดังนั้นค่าไมล์ของคุณอาจแตกต่างกันไป

#!/usr/bin/env bash

echo 'stats items'  \
| nc localhost 11211  \
| grep -oe ':[0-9]*:'  \
| grep -oe '[0-9]*'  \
| sort  \
| uniq  \
| xargs -L1 -I{} bash -c 'echo "stats cachedump {} 1000" | nc localhost 11211'

สิ่งที่ทำมันผ่านแผ่นแคชทั้งหมดและพิมพ์ 1,000 รายการของแต่ละรายการ

โปรดทราบถึงขีด จำกัด บางประการของสคริปต์นี้เช่นอาจไม่สามารถปรับขนาดสำหรับเซิร์ฟเวอร์แคช 5GB ได้ แต่มีประโยชน์สำหรับวัตถุประสงค์ในการดีบักบนเครื่องท้องถิ่น


3
ใน Debian 8 ด้วยmemcached 1.4.21-1.1+deb8u1ฉันต้องส่งคำสั่งเลิกไปยัง memcached อย่างชัดเจน ฉันแก้ไขคำสั่งของคุณเป็นสิ่งนี้และทำงานได้อย่างถูกต้องแล้ว: echo -e "stats items\nquit" | nc localhost 11211 | grep -oe ':[0-9]*:' | grep -oe '[0-9]*' | sort | uniq | xargs -L1 -I{} bash -c 'echo -e "stats cachedump {} 1000\nquit" | nc localhost 11211'ขอบคุณที่แบ่งปันสิ่งนี้! มีประโยชน์มากสำหรับการดีบัก :)
Cha0s

ด้วยเหตุผลบางประการ grep -oe '[0-9] *' ไม่ทำงานใน iTerm2 บน mac ต้องแทนที่ด้วย grep -Eo '[0-9] {1,99}'
max4ever

นี่เป็นสิ่งที่ดี แต่มันพลาดคีย์บางอย่างคิดว่าทำไม?
ผู้ใช้

14

หากคุณติดตั้ง PHP & PHP-memcached คุณสามารถเรียกใช้ไฟล์

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'

1
คุณต้องทำสิ่งนี้หลังจาก addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); สำหรับ Memcached เวอร์ชันใหม่กว่า
hack4mer

คำตอบยังคงเป็นบูล (เท็จ) :-(
Wolfgang Blessen

2
@WolfgangBlessen - นั่นเป็นเพราะข้อผิดพลาดใน memcached - ได้รับการแก้ไขในเวอร์ชันใหม่ล่าสุด github.com/php-memcached-dev/php-memcached/issues/203
billynoah

@billynoah Thx ตอนนี้ฉันเห็นผลลัพธ์แล้วและ memcached เริ่มมีประโยชน์ :-)
Wolfgang Blessen

12

ทุบตี

หากต้องการรับรายการคีย์ใน Bash ให้ทำตามขั้นตอนเหล่านี้

ขั้นแรกกำหนดฟังก์ชัน wrapper ต่อไปนี้เพื่อให้ใช้งานง่าย (คัดลอกและวางลงในเชลล์):

function memcmd() {
  exec {memcache}<>/dev/tcp/localhost/11211
  printf "%s\n%s\n" "$*" quit >&${memcache}
  cat <&${memcache}
}

Memcached 1.4.31 ขึ้นไป

คุณสามารถใช้lru_crawler metadump allคำสั่งเพื่อถ่ายโอนข้อมูล (ส่วนใหญ่) ข้อมูลเมตาสำหรับ (ทั้งหมด) รายการในแคช

ในทางตรงกันข้ามจะcachedumpไม่ก่อให้เกิดปัญหาด้านประสิทธิภาพที่รุนแรงและไม่มีข้อ จำกัด เกี่ยวกับจำนวนคีย์ที่สามารถทิ้งได้

ตัวอย่างคำสั่งโดยใช้ฟังก์ชันที่กำหนดไว้ก่อนหน้านี้:

memcmd lru_crawler metadump all

ดู: ReleaseNotes1431


Memcached 1.4.30 และต่ำกว่า

รับรายการแผ่นพื้นโดยใช้คำสั่งสถิติรายการเช่น:

memcmd stats items

สำหรับแต่ละคลาส slub คุณสามารถรับรายการไอเท็มได้โดยระบุ slub id พร้อมกับ จำกัด จำนวน ( 0- ไม่ จำกัด ):

memcmd stats cachedump 1 0
memcmd stats cachedump 2 0
memcmd stats cachedump 3 0
memcmd stats cachedump 4 0
...

หมายเหตุ: คุณต้องทำสิ่งนี้สำหรับเซิร์ฟเวอร์ memcached แต่ละเครื่อง

ในการแสดงรายการคีย์ทั้งหมดจากต้นขั้วทั้งหมดนี่คือหนึ่งซับ (ต่อหนึ่งเซิร์ฟเวอร์):

for id in $(memcmd stats items | grep -o ":[0-9]\+:" | tr -d : | sort -nu); do
    memcmd stats cachedump $id 0
done

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


หมายเหตุ:

stats cachedumpทิ้งเฉพาะHOT_LRU(IIRC?) ซึ่งจัดการโดยเธรดพื้นหลังเมื่อมีกิจกรรมเกิดขึ้น ซึ่งหมายความว่าภายใต้เวอร์ชันใหม่ที่เพียงพอซึ่งเปิดใช้งาน 2Q algo คุณจะได้รับมุมมองภาพรวมของสิ่งที่อยู่ใน LRU เพียงรายการเดียว

หากคุณต้องการดูทุกอย่างlru_crawler metadump 1(หรือlru_crawler metadump all) เป็นวิธีการใหม่ที่ได้รับการสนับสนุนอย่างเป็นทางการซึ่งจะถ่ายโอนข้อมูลคีย์ได้มากเท่าที่คุณต้องการแบบอะซิงโครนัส คุณจะทำให้พวกเขาไม่เป็นระเบียบ แต่มันเข้ากับ LRU ทั้งหมดและเว้นแต่คุณจะลบ / แทนที่รายการหลาย ๆ การวิ่งควรให้ผลลัพธ์เหมือนกัน

ที่มา: GH-405


ที่เกี่ยวข้อง:


5

วิธีที่ง่ายที่สุดคือใช้แพ็คเกจ python-memcached-stats https://github.com/abstatic/python-memcached-stats

วิธีการคีย์ () จะช่วยให้คุณไปได้

ตัวอย่าง -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]

1
คุณสามารถทำได้จากบรรทัดคำสั่งด้วยpython -m memcached_stats <ip> <port>
Martijn

1
Python2 เท่านั้นในขณะนี้
Marius

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