web-dev-qa-db-fra.com

Comment puis-je obtenir tous les ensembles de Redis?

Je connais la commande Keys, mais cela ne renvoie que les clés (je suppose que toutes les clés avec la chaîne de type) et apparemment des ensembles ne sont pas considérés comme des clés considérées.

Y a-t-il une commande pour obtenir tous les ensembles de la base de données? Qu'en est-il des autres types de données (hachage, liste, définis triés)?

http://redis.io/topics/data-types

21
beatgammit

Je connais la commande Keys, mais cela ne renvoie que les clés (je suppose que toutes les clés avec la chaîne de type) et apparemment des ensembles ne sont pas considérés comme des clés considérées.

Touches Commandez les résultats de retour quelconque quel type de données sont vos clés, car elle recherche les noms de clés. Au niveau de l'abstraction la plus basse, chaque type de données dans REDIS est basé sur la clé/la valeur où la valeur peut être représentée par l'une des structures de données (avancées) (chaîne, hachage, liste, définie, définie, définie, définie). Vous pouvez voir que la commande Keys fonctionne également pour les ensembles dans son ensemble Exemples .

Y a-t-il une commande pour obtenir tous les ensembles de la base de données? Qu'en est-il des autres types de données (hachage, liste, définis triés)?

Pour autant que je sache, aucune commande dédiée pour cette fonctionnalité et la commande Teys est appliquée sur l'ensemble de données complète de votre base de données. Cependant, il y a un [~ # ~ # ~] type [~ # ~] Commande qui peut déterminer le type de données de la clé spécifiée.

31
yojimbo87

La réponse a été correcte pour son temps, mais celle-ci est prise en charge de ReDIS 2.8.0 - Vérifiez SCAN

6
Amnon

Dans Cli-Redis, vous pouvez essayer de faire:

KEYS *
1

À partir de la version 6.0, vous pouvez utiliser SCAN 0 TYPE set. Voir https://redis.io/commands/scan#the-type-Option

Pour les versions antérieures à 6.0, vous pouvez utiliser un script Lua pour filtrer le côté serveur, ce qui permet d'enregistrer le temps de déplacement (RTT) de faire TYPE appelle du client.

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[3] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * set

Les paramètres au script sont 0(numkeys) cursor matchPattern type. Par exemple. 0 0 * set

Voici une vue amicale du script Lua:

local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2])
local filtered = {}
for _,key in ipairs(result[2]) do
    if redis.call('TYPE', key).ok == ARGV[3] then
        table.insert(filtered, key)
    end
end
result[2] = filtered
return result

La valeur renvoyée est la même que avec SCAN, juste avec la liste des touches filtrées par type.

Comme avec SCAN, vous devez appeler plusieurs fois jusqu'à ce que le curseur renvoyé soit zéro.

Cette approche est beaucoup mieux que d'utiliser KEYS, car elle ne bloquera pas longtemps le serveur.

Suivant est le même script mais avec l'option de comptage, à faire moins de travail ou plus par appel. Le nombre devrait être supérieur à zéro.

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[4] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * 100 set

Les paramètres au script sont 0(numkeys) cursor matchPattern count type. Par exemple. 0 0 * 100 set

0
LeoMurillo