количество ключей, соответствующих шаблону

как я могу найти количество всех ключей, которые имеют соответствующий шаблон.

например, есть два ключа 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"

из командной строки redis-cli --scan --pattern 'abc:*' | wc -l