количество ключей, соответствующих шаблону
как я могу найти количество всех ключей, которые имеют соответствующий шаблон.
например, есть два ключа abc:random-text-1
и abc:random-text-2
. Общая картина здесьabc:
. Итак, здесь счет 2.
как я могу сделать это в Redis?
5 ответов
отказ от ответственности Я надеюсь, что этот старый ответ не повредил никаких производственных систем с миллионами ключей. Если вы все еще хотите по-прежнему считать соответствующие ключи redis в производстве по какой-то причине, лучше использовать сканирование с шаблоном соответствия.
если вы просто искать с ключами, с вашим клиентом redis, вы получите список номеров всех вас соответствующие ключи, не так ли?
например
KEYS abc:*
даст вам
1) abc:random-text-1
2) abc:random-text-2
или вы можно запустить следующее:
./redis-cli KEYS "abc:*" | wc -l
и вы получите 2
как выход.
С здесь:
eval "return #redis.pcall('keys', 'abc:*')" 0
Это не за O(1), но по крайней мере подсчет выполняется на стороне сервера.
учитывая производительность, я бы не рекомендовал вам использовать KEYS
предупреждение: рассматривайте ключи как команду, которая должна использоваться только в производственные среды с особой тщательностью. Это может испортить производительность когда он выполняется для больших баз данных. Эта команда предназначена для отладки и специальных операций, таких как изменение скорости макет. Не используйте ключи в обычном коде приложения. Если вы ищу способ найти ключи в ... подмножество ключей, рассмотреть использование наборов.
Я бы предложил вам рассмотреть сканирование, если ваша версия redis > 2.8.0. Но он зависит от того, какой тип данных вы собираетесь использовать.
вот простой пример из redis doc:
redis 127.0.0.1:6379> sadd myset 1 2 3 foo foobar feelsgood
(integer) 6
redis 127.0.0.1:6379> sscan myset 0 match f*
1) "0"
2) 1) "foo"
2) "feelsgood"
3) "foobar"
Если это одноразовая вещь, вы можете использовать ключи, как описано x_maras, но вы не должны использовать это в своем коде, так как ключи будут сканировать каждый ключ во всей базе данных каждый раз, когда он вызывается.
Если вы хотите делать это часто, нет" хорошего " способа точно так, как вы написали, потому что всегда будет довольно неэффективно сканировать каждый ключ (даже с помощью сканирования, так как он будет делать то же самое, что и ключи, только более безопасным способом).
однако, если вам нужны шаблоны известны заранее, вы можете сохранить набор каждого ключа, который соответствует шаблону.
SET abc:random-text-1 "blah"
SADD patterns:abc abc:randomtext-1
SET abc:random-text-2 "more blah"
SADD patterns:abc abc:randomtext-2
SCARD patterns:abc
// (integer) 2
SORT patterns:abc BY nosort GET *
// 1) "blah"
// 2) "more blah"