Можно ли получить / найти ключи Memcached по префиксу? - PullRequest
15 голосов
/ 03 февраля 2011

Я пишу в memcached много ключа / значения -> PREFIX_KEY1, PREFIX_KEY2, PREFIX_KEY3

Мне нужно получить все ключи, которые начинаются с PREFIX_

Возможно ли это?

Ответы [ 4 ]

22 голосов
/ 03 февраля 2011

Извините, но нет. Memcached использует алгоритм хеширования, который распределяет ключи в явно случайных местах, поэтому эти ключи разбросаны по всему. Вам нужно отсканировать все, чтобы найти их.

Также вы должны знать, что memcached может сбросить любую любую клавишу в любое время и по любой причине. Если вы кладете вещи, вы должны знать, что вы не можете рассчитывать на то, что они вернутся. Это абсолютно нормально для оригинального варианта использования, кеша для уменьшения попаданий в базу данных. Но это может быть серьезной проблемой, если вы хотите сделать что-то более сложное с ним.

Если эти ограничения являются проблемой, я бы предложил вместо этого использовать Redis. Он ведет себя во многом как memcached, за исключением того, что он сохраняет данные и позволяет хранить сложные структуры данных. Таким образом, для вашего случая использования вы можете сохранить хэш в Redis, а затем вытащить весь хэш.

6 голосов
/ 20 апреля 2016

Быстрая команда для поиска, если конкретный ключ существует (имя ключа может быть "grep regex")

for i in {1..40}; do (echo "stats cachedump $i 0"; sleep 1; echo "quit";) | telnet localhost 11211 | grep 'APREFIX*\|ANOTHERPREFIX*'; done
  • это номер плиты
  • в приведенном выше примере мы ищем плиты от 1 до 40
  • не пропустите часть grep 'APREFIX * \ | ANOTHERPREFIX *';)
  • на основании обсуждения на https://groups.google.com/forum/#!topic/memcached/YyzonP9HUi0
4 голосов
/ 14 февраля 2014

Хотя @btilly правильно говорит, что memcached не делает это изначально, вы можете эмулировать его (довольно эффективно), поддерживая индекс ключей, которые разделяют ваш префикс, позволяя вам затем выбирать все записи, которые соответствуют определенному префиксу.

Очевидно, что это будет работать только для определенных ключей, которые вы выбрали заранее, а не для произвольных данных, но это вполне работоспособно, если вы можете жить с этим ограничением. есть хорошая статья на эту тему от одного из разработчиков memcache.

3 голосов
/ 18 октября 2012

Вы можете использовать Пространство имен и выполнять то, что вам нужно.Вот библиотека PHP, которая выполняет то же самое.Вы можете использовать один и тот же Memcached для нескольких приложений.

https://github.com/vijayabose/n_memcached

...