7
votes

Comment supprimer plusieurs clés de Redis avec le même motif en PHP en utilisant Phpredis?

En utilisant Phpredis , j'ai enregistré des données dans la pagination comme ceci: XXX

1 et 2 sont des numéros de page. J'ai lu dans le document que vous pouvez utiliser des caractères génériques pour récupérer plusieurs clés. xxx

mais puis-je supprimer toutes les anciennes clés à l'aide de caractères génériques lorsque quelqu'un a posté une nouvelle critique? Puis-je faire quelque chose comme: xxx

Cela n'a pas fonctionné cependant.


1 commentaires

N'utilisez jamais la commande Touches sur l'environnement de production car elle bloquera l'ensemble de la DB jusqu'à ce que la touche recherchée soit trouvée. Au lieu de cela, vous pouvez utiliser Scan pour rechercher une clé spécifique pour la production env.


7 Réponses :


4
votes

Non - Redis ' del n'accepte pas les caractères génériques, vous devez nommer les clés explicitement. Voyez ici pour les directions possibles: https://stackoverflow.com/a/23399125/3160475


2 commentaires

Merci. J'ai fini par utiliser $ AllKeys = $ Redis-> clés ("itema * '); et bouclé sur les résultats pour les supprimer un par un. Je ne sais pas si c'est la meilleure façon de le faire.


Définitivement l'une des pires façons;) clés est une commande diabolique que vous devriez, en règle générale, abstenez-vous d'utiliser (sauf que vous soyez courageux, imbécile ou les deux)



1
votes
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';

$res = @shell_exec($bash);

3 commentaires

Veuillez vous abstenir de publier des réponses uniquement du code, car ils n'aident pas la communauté à améliorer en apprenant à résoudre un problème. Essayez d'expliquer pourquoi votre solution aiderait à résoudre le problème avec le code.


Il est préférable d'ajouter plus de contexte / d'explication autour du code (par opposition à la réponse à une réponse uniquement au code), car cela rend la réponse plus utile.


Bien que cette extrait de code puisse résoudre le problème, cela n'explique pas pourquoi ni comment il répond à la question. S'il vous plaît Inclure une explication de votre code , car cela aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Flagriers / critiques: Pour les réponses de codes, telles que celle-ci, Downvote, ne supprimez pas!



1
votes

J'utilise simplement xxx

Ça fonctionne bien pour moi.


4 commentaires

Cela ne signifie-t-il que tout car vous correspondez à chaque touche?


C'est une réponse dangereuse


Ouais, mais vous pouvez utiliser un masque comme un espace de noms / *


Redis :: Supprimer est obsolète maintenant. Il utilise une utilisation possible redis :: del ?



3
votes

Lorsque vous utilisez PHPREDIS code>, vous pouvez obtenir le préfixe (que PPPREDIS se répète automatiquement partout) et supprimez un motif de touches de la manière suivante:

<?php
...

$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
    function ($key) use ($prefix) {
        return str_replace($prefix, '', $key);
    }, $redisClient->keys('*'))
);


1 commentaires

Un peu d'amélioration pour assurer la suppression de la chaîne (préfixe) à partir de la gauche: Preg_replace ("/ ^ $ {préfixe} /", '', clé $); en faveur de str_replace < / code>.



0
votes

avec prédis , je le fais comme ceci: XXX < / p>


0 commentaires

1
votes

prédis ( -> del code>) permet de passer une matrice de clés aussi.
Il fonctionne ici et est plus rapide que le del code> à l'intérieur du foreach code>.

$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);


3 commentaires

Une bonne réponse a une meilleure explication Comment puis-je écrire une bonne réponse?


Qu'est-ce que $ préfixe = $ ceci-> Client-> getOptions ($ this-> opt_prefix); ici dans ce code Snippet?


C'est une bien meilleure solution que d'itération sur chaque clé. Upvoted.



0
votes

Il n'y a pas de caractères génériques pour la fonction Supprimer . Solution de contournement comme suit, xxx

Remarque: @Akash Gangrade commenté, clés () non invitée à utiliser en raison de la performance. Vous pouvez envisager une invalidation de cache basée sur des tags comme HTTPS: // symfony.com/doc/current/components/cache/cache_invalidation.html#tag-aware-adapters


0 commentaires