Подтвердить что ты не робот

Можно ли получить/найти ключи Memcached с помощью префикса?

Я пишу для memcached много key/value → PREFIX_KEY1, PREFIX_KEY2, PREFIX_KEY3

Мне нужно получить все ключи, начинающиеся с PREFIX _

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

https://github.com/vijayabose/n_memcached

Ответ 4

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

for i in {1..40}; do (echo "stats cachedump $i 0"; sleep 1; echo "quit";) | telnet localhost 11211 | grep 'APREFIX*\|ANOTHERPREFIX*'; done