web-dev-qa-db-fra.com

nombre de clés correspondant à un motif

Comment puis-je trouver le nombre de toutes les clés ayant un motif correspondant.

Par exemple, il y a deux clés abc:random-text-1 et abc:random-text-2. Le modèle commun ici isabc:. Donc, ici, le compte est 2.

Comment puis-je faire cela dans Redis?

56
shanks

[~ # ~] disclaimer [~ # ~] J'espère que cette vieille réponse n'a endommagé aucun système de production, avec des millions de clés. Si vous souhaitez toujours compter les clés correspondantes de redis en production pour une raison quelconque, il est préférable d’utiliser Scan avec un modèle de correspondance .

Si vous recherchez simplement avec KEYS, avec votre client Redis, vous obtiendrez une liste de numéros de toutes les clés correspondantes, non?

par exemple.

KEYS abc:*

te donnera

1) abc:random-text-1
2) abc:random-text-2

ou vous pouvez exécuter ce qui suit:

./redis-cli KEYS "abc:*" | wc -l

et vous aurez 2 comme sortie.

53
x_maras

De ici :

eval "return #redis.pcall('keys', 'abc:*')" 0

Ce n'est pas O (1), mais au moins le compte est fait du côté serveur.

54
warvariuc

En considérant les performances, je ne vous recommanderais pas d'utiliser KEYS

Avertissement: considérez KEYS comme une commande qui ne doit être utilisée que dans des environnements de production avec un soin extrême. Cela risque de nuire aux performances lorsqu'il est exécuté sur des bases de données volumineuses. Cette commande est destinée au débogage et à des opérations spéciales, telles que la modification de la disposition de votre espace clé. N'utilisez pas KEYS dans votre code d'application habituel. Si vous cherchez un moyen de rechercher des clés dans un sous-ensemble de votre espace de clés, envisagez d'utiliser des ensembles.

Je vous suggérerais de considérer scan , si votre version de Redis> 2.8.0. Mais cela dépend du type de données que vous allez utiliser.

Voici un exemple simple tiré de 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"
20
Joshua

S'il s'agit d'une opération ponctuelle, vous pouvez utiliser KEYS comme décrit par x_maras, mais vous ne devriez pas l'utiliser dans votre code, car KEYS analysera chaque clé de la base de données à chaque appel.

Si vous voulez le faire fréquemment, il n’existe pas de "bonne" méthode exactement comme vous l’avez écrit car il sera toujours assez inefficace d’analyser chaque clé (même avec SCAN, car cela ferait la même chose que KEYS dans un manière plus sûre).

Toutefois, si les modèles dont vous avez besoin sont connus à l'avance, vous pouvez conserver un ensemble de chaque clé correspondant au modèle.

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"
13
ben

A partir de la ligne de commande, redis-cli --scan --pattern 'abc:*' | wc -l

8
mushuweasel