174 votes

Obtenir toutes les clés définies dans Memcached

Comment puis-je obtenir toutes les clés définies dans mon instance(s) memcached ?

J'ai essayé de chercher sur Google, mais je n'ai pas trouvé grand-chose, sauf que PHP supporte une méthode getAllKeys, ce qui signifie qu'il est effectivement possible de le faire d'une manière ou d'une autre. Comment puis-je faire la même chose dans une session telnet ?

J'ai essayé toutes les options de récupération mentionnées dans la feuille de triche memcached et le résumé des commandes telnet Memcached, mais aucune d'entre elles ne fonctionne et je suis perdu pour trouver la bonne façon de le faire.

Remarque : Je fais actuellement cela en développement, donc on peut supposer qu'il n'y aura pas de problèmes dus à de nouvelles clés définies ou à d'autres conditions de concurrence, et le nombre de clés sera également limité.

6voto

abhishek_M Points 672

La manière la plus simple est d'utiliser le package python-memcached-stats, https://github.com/abstatic/python-memcached-stats

La méthode keys() devrait vous aider à démarrer.

Exemple -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]

1voto

Satvik Nema Points 59

J'utilisais spyMemcached de Java et j'ai utilisé ce code. Il est basé sur la réponse d'Anshul Goyal

@Autowired
@Qualifier("initMemcachedClient")
private MemcachedClient memcachedClient;

public List getCachedKeys(){
    Set slabIds = new HashSet<>();
    Map> stats;
    List keyNames = new ArrayList<>();

    // Obtient tous les IDs de slab
    stats = memcachedClient.getStats("items");
    stats.forEach((socketAddress, value) -> {
        System.out.println("Adresse socket : "+socketAddress.toString());
        value.forEach((propertyName, propertyValue) -> {
            slabIds.add(Integer.parseInt(propertyName.split(":")[1]));
        });
    });

    // Obtient toutes les clés de chaque ID de slab et les ajoute dans la liste keyNames
    slabIds.forEach(slabId -> {
        Map> keyStats = memcachedClient.getStats("cachedump "+slabId+" 0");
        keyStats.forEach((socketAddress, value) -> {
            value.forEach((propertyName, propertyValue) -> {
                keyNames.add(propertyName);
            });
        });
    });

    System.out.println("nombre de clés : "+keyNames.size());
    return keyNames;
}

1voto

Modifier - d'abord j'ai posté ici encore une autre solution basée sur slab list + stats cachedump, mais ensuite j'ai appris une leçon difficile, à savoir que ce dernier ne renvoie pas toutes les clés.

Voir aussi problème memcached n°405.

Heureusement, il y a une meilleure solution : lru_crawler metadump all.

La seule chose amusante est que lru_crawler renvoie des clés encodées en URL. Je n'aimais pas ça, donc mon script le plus court ressemble à ceci:

#!/bin/bash
host=localhost
port=11211

run_memc() {
    nc -q0 $host $port
}

echo 'lru_crawler metadump all' | run_memc | grep -v ^END \
    | ruby -rcgi -ne 'puts CGI.unescape $_' | sort

J'ai utilisé unescape de Ruby car c'était le plus court : Perl ne semble pas avoir unescape/urldecode par défaut, l'import Python + boucle ne serait certainement pas réduit à une seule ligne, et j'avais toujours Ruby installé. Votre expérience peut varier.

0voto

drt Points 95

Solution Java :

Merci! @Satvik Nema Votre solution m'a aidé à trouver l'approche, mais elle ne fonctionne pas pour la version 2.4.6 de memcached (implementation 'com.googlecode.xmemcached:xmemcached:2.4.6') Je ne sais pas quand la nouvelle méthode getStatsByItem a été incluse. J'ai trouvé les changements nécessaires en utilisant la documentation et le code ci-dessous a fonctionné pour moi.

// Obtient tous les identifiants de flambeaux
            Set slabIds = new HashSet<>();
            Map> itemsMap = null;
            try {
                itemsMap = this.memcachedClient.getStatsByItem("items");
            } catch (Exception e) {
                log.error("Échec lors de la récupération des 'items'. ERREUR", e);
            }

            if (Objects.nonNull(itemsMap)) {
                itemsMap.forEach((key, value) -> {
                    log.info("itemsMap {} : {}", key, value);
                    value.forEach((k, v) -> {
                        slabIds.add(Integer.parseInt(k.split(":")[1]));
                    });
                });
            }

            // Obtient toutes les clés dans chaque identifiant de flambeaux et les ajoute dans la liste keyNames
            slabIds.forEach(slabId -> {
                Map> keyStats = null;
                try {
                    keyStats = this.memcachedClient.getStatsByItem("cachedump " + slabId + " 0");
                } catch (Exception e) {
                    log.error("Échec lors de la récupération de 'cachedump' pour slabId: {}. ERREUR", slabId, e);
                }
                if (Objects.nonNull(keyStats)) {
                    keyStats.forEach((socketAddress, value) -> {
                        value.forEach((propertyName, propertyValue) -> {
                            //keyNames.add(propertyName);
                            log.info("NomClé: {} Valeur: {}", propertyName, propertyValue);
                        });
                    });
                }
            });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X