lấy tất cả các khóa được đặt trong memcached


131

Làm cách nào tôi có thể nhận được tất cả các khóa được đặt trong (các) ví dụ memcached của mình?

Tôi đã thử googling, nhưng không tìm thấy nhiều ngoại trừ việc PHPhỗ trợ một getAllKeysphương thức , điều đó có nghĩa là thực sự có thể làm điều này bằng cách nào đó. Làm thế nào tôi có thể nhận được điều tương tự trong một phiên telnet?

Tôi đã thử tất cả các tùy chọn liên quan đến truy xuất được đề cập trong bảng cheat memcachedtóm tắt lệnh telnet Memcached , nhưng không có cái nào trong số chúng hoạt động và tôi không thể tìm ra cách chính xác để làm điều này.

Lưu ý: Tôi hiện đang thực hiện việc này trong quá trình phát triển, vì vậy có thể giả định rằng sẽ không có vấn đề gì do các khóa mới được đặt hoặc các điều kiện cuộc đua như vậy xảy ra và số lượng khóa cũng sẽ bị hạn chế.


Kiểm tra bài viết của tôi . Tôi đã có cùng một vấn đề và tôi tìm thấy một giải pháp.
Peter VARGA

github.com/clickalicy/phpmemadmin có vẻ hữu ích (nếu tôi có thể tìm ra cách để nó hoạt động với Laravel Homestead Vagrant; hiện tại nó không hiển thị khóa).
Ryan

Câu trả lời:


178

Tìm thấy một cách, nhờ vào liên kết ở đây (với thảo luận nhóm google ban đầu ở đây )

Đầu tiên, Telnetđến máy chủ của bạn:

telnet 127.0.0.1 11211

Tiếp theo, liệt kê các mục để có id id slab:

mục thống kê
Mục STAT: 3: số 1
Vật phẩm STAT: 3: 498 tuổi
Mục STAT: 22: số 1
Vật phẩm STAT: 22: 498 tuổi
KẾT THÚC

Số đầu tiên sau 'mục' là id slab. Yêu cầu kết xuất bộ đệm cho mỗi id slab, với giới hạn cho số lượng khóa tối đa để kết xuất:

thống kê lưu trữ 3 100
ITEM lượt xem.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
KẾT THÚC

thống kê bộ nhớ cache 22 100
ITEM lượt xem.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
KẾT THÚC


4
Xin lưu ý rằng bộ đệm ẩn số liệu thống kê là một tính năng không có giấy tờ và không được hỗ trợ bởi nhóm memcached. Nó chỉ có nghĩa là để gỡ lỗi và không dành cho sử dụng sản xuất.
mikewied

Ồ được thôi. Như tôi đã nói trong câu hỏi của mình, tôi hiện chỉ ở chế độ phát triển và cần điều đó để gỡ lỗi.
mu

3
blà byte, slà thời gian kỷ nguyên giây
Abraham Sangha

1
@Dan Có thể bạn đang xem bằng các câu trả lời chủ động trước, sắp xếp các bài trả lời dựa trên thời điểm họ có hoạt động lần cuối. Nếu có, bạn có thể thay đổi điều đó bằng cách chọn một trong những hoạt động / cũ nhất / phiếu bầu ngay bên dưới văn bản câu hỏi. Ngoài ra, câu trả lời này nằm ở đầu trong chế độ ẩn danh.
mu

2
Ngoài ra còn lru_crawler metadump allcó tất cả các khóa bộ nhớ cache, không "chỉ" 1M đầu tiên .. github.com/memcached/memcached/blob/ Lỗi
Kaos

65

memdump

Có một lệnh memcdump(đôi khi memdump) cho điều đó (một phần của libmemcached-tools), ví dụ:

memcdump --servers=localhost

Nó sẽ trả về tất cả các phím.


memcached-tool

Trong phiên bản gần đây memcachedcũng có memcached-toollệnh, vd

memcached-tool localhost:11211 dump | less

mà bỏ tất cả các khóa và giá trị.

Xem thêm:


4
cẩn thận với 'memdump' lệnh này là một cách tuyệt vời để đánh sập thiết bị đầu cuối của bạn.
deweydb

5
Cẩn thận! Lệnh dumpphụ memcached-tooldường như xóa hết bộ đệm :( - tôi sẽ an toàn hơn khi sử dụng displayhoặc statstrước tiên.
MarkHu

4
Trong Ubuntu Xenial, gói chứa memdump được gọi libmemcached-toolsvà nhị phân của công cụ được gọi là memcdump.
thenickdude

5
Đối với những người tìm kiếm memcached-toolnó hơi bị ẩn trong một thư mục, có thể không có trong một tiêu chuẩn PATH- ít nhất là trên Ubuntu Xenial - tại đây:/usr/share/memcached/scripts/
sxc731

17

Dựa trên @mu 無 trả lời ở đây. Tôi đã viết một kịch bản kết xuất bộ đệm.

Kịch bản bỏ tất cả nội dung của một máy chủ memcached. Nó đã được thử nghiệm với Ubuntu 12.04 và một localhost memcached, do đó, milage của bạn có thể thay đổi.

#!/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'

Những gì nó làm, nó đi qua tất cả các tấm bộ đệm và in 1000 mục của mỗi.

Xin lưu ý về các giới hạn nhất định của tập lệnh này, ví dụ: nó có thể không mở rộng cho máy chủ bộ đệm 5GB chẳng hạn. Nhưng nó hữu ích cho mục đích gỡ lỗi trên máy cục bộ.


3
Trên Debian 8, memcached 1.4.21-1.1+deb8u1tôi đã phải gửi một lệnh thoát một cách rõ ràng đến memcached. Tôi đã sửa đổi lệnh của bạn thành điều này và hoạt động đúng cách: 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'Cảm ơn bạn đã chia sẻ điều này! Khá hữu ích để gỡ lỗi :)
Cha0s

vì một số lý do, grep -oe '[0-9] *' không hoạt động trong iTerm2 trên mac, phải thay thế bằng grep -Eo '[0-9] {1,99}'
max4ever

Điều này là tiện lợi, nhưng nó bỏ lỡ một số phím, bất kỳ ý tưởng tại sao?
người dùng

14

Nếu bạn đã cài đặt PHP & PHP-memcached, bạn có thể chạy

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

1
Bạn cần thực hiện việc này sau khi addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Đối với các phiên bản mới hơn của Memcached
hack4mer

Vẫn là câu trả lời là bool (sai) :-(
Wolfgang Blessen

2
@WolfgangBlessen - đó là do lỗi trong memcached - nó đã được sửa trong các phiên bản mới nhất. github.com/php-memcached-dev/php-memcached/issues/203
billynoah 27/11/18

@billynoah Thx, tôi thực sự thấy kết quả bây giờ và memcached đang bắt đầu hữu ích :-)
Wolfgang Blessen

12

Bash

Để có được danh sách các khóa trong Bash, hãy làm theo các bước sau.

Đầu tiên, xác định hàm bao bọc sau để đơn giản hơn (sao chép và dán vào shell):

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

Memcached 1.4.31 trở lên

Bạn có thể sử dụng lru_crawler metadump alllệnh để kết xuất (hầu hết) siêu dữ liệu cho (tất cả) các mục trong bộ đệm.

Trái ngược với cachedumpnó, nó không gây ra vấn đề hiệu năng nghiêm trọng và không có giới hạn về số lượng phím có thể bị đổ.

Lệnh ví dụ bằng cách sử dụng hàm được xác định trước đó:

memcmd lru_crawler metadump all

Xem: ReleaseNotes1431 .


Memcached 1.4.30 trở xuống

Nhận danh sách các tấm bằng cách sử dụng lệnh thống kê vật phẩm , ví dụ:

memcmd stats items

Đối với mỗi lớp slub, bạn có thể nhận danh sách các mục bằng cách chỉ định id slub cùng với số giới hạn ( 0- không giới hạn):

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

Lưu ý: Bạn cần làm điều này cho mỗi máy chủ memcached.

Để liệt kê tất cả các khóa từ tất cả các sơ khai, đây là một lớp (trên một máy chủ):

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

Lưu ý: Lệnh trên có thể gây ra sự cố hiệu suất nghiêm trọng trong khi truy cập các mục, vì vậy không nên chạy trực tiếp.


Ghi chú:

stats cachedumpchỉ loại bỏ HOT_LRU(IIRC?), được quản lý bởi một luồng nền khi hoạt động xảy ra. Điều này có nghĩa là dưới một phiên bản đủ mới mà thuật toán 2Q đã kích hoạt, bạn sẽ có được các chế độ xem nhanh về những gì chỉ trong một trong các LRU.

Nếu bạn muốn xem tất cả mọi thứ, lru_crawler metadump 1(hoặc lru_crawler metadump all) là phương thức mới được hỗ trợ chính thức mới sẽ kết xuất không đồng bộ nhiều khóa như bạn muốn. bạn sẽ nhận được chúng không theo thứ tự nhưng nó đạt tất cả các LRU và trừ khi bạn xóa / thay thế các mục nhiều lần chạy sẽ mang lại kết quả tương tự.

Nguồn: GH-405 .


Liên quan:


5

Cách dễ nhất là sử dụng gói python-memcached-stats, https://github.com/abstatic/python-memcached-stats

Phương thức key () sẽ giúp bạn đi.

Thí dụ -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

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

1
Bạn thậm chí có thể làm điều đó từ dòng lệnh vớipython -m memcached_stats <ip> <port>
Martijn

1
Python2 chỉ, tại thời điểm này.
Marius

Sẽ có bất kỳ giới hạn về số lượng phím được trả lại hoặc kích thước?
loknath
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.