Можно ли получить / найти ключи Memcached по префиксу?
Я пишу в memcached много ключа / значения -> PREFIX_KEY1, PREFIX_KEY2, PREFIX_KEY3
Мне нужно получить все ключи, которые начинаются с PREFIX_
Является ли это возможным?
4 ответа
Извините, но не. Memcached использует алгоритм хеширования, который распределяет ключи в очевидно случайных местах, и поэтому эти ключи разбросаны повсюду. Вы должны сканировать все, чтобы найти их.
Также вы должны знать, что memcached по своему замыслу может отбрасывать любую любую клавишу в любое время и по любой причине. Если вы кладете вещи, вы должны знать, что вы не можете рассчитывать на то, что они вернутся. Это абсолютно нормально для оригинального варианта использования, кеша для уменьшения попаданий в базу данных. Но это может быть серьезной проблемой, если вы хотите сделать что-то более сложное с этим.
Если эти ограничения являются проблемой, я бы посоветовал вам использовать Redis. Он ведет себя во многом как memcached, за исключением того, что он сохраняет данные и позволяет хранить сложные структуры данных. Таким образом, для вашего случая использования вы можете сохранить хэш в Redis, а затем вытащить весь хэш позже.
Быстрая команда для поиска, если конкретный ключ существует (имя ключа может быть "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/
Хотя @btilly правильно говорит, что memcached не делает этого изначально, вы можете эмулировать его (довольно эффективно), поддерживая индекс ключей, разделяющих ваш префикс, что позволяет вам затем выбирать все записи, которые соответствуют определенному префиксу.
Очевидно, что это будет работать только для определенных ключей, которые вы выбираете заранее, а не для произвольных данных, но это вполне работоспособно, если вы можете жить с этим ограничением. На эту тему есть хорошая статья одного из разработчиков memcache.
Вы можете использовать Namespace и выполнять то, что вам нужно. Вот библиотека PHP, которая выполняет то же самое. Вы можете использовать один и тот же Memcached для нескольких приложений.