2017-04-27 11 views
2

J'ai une application php redis très simple qui crée des clés à certains événements. Toutes les clés sont juste des compteurs et ont une durée d'expiration de 24 heures. Fondamentalement, une fenêtre mobile de 24 heures pour chaque clé pour recueillir des statistiques.Redis: Comment le résultat de KEYS * est-il trié?

if ($redis->exists($key)) { 
    $redis->incr($key); 
} 
else { 
    $redis->set($key, '1'); 
    $now = time(); // current timestamp 
    $redis->expireAt($key, $now + 86400); 
} 

Quand j'extrais un aperçu de toutes mes clés avec $list = $redis->keys("*"); (ou dans une console Redis-cli avec keys *), je suppose un ordre chronologique par date de création. Cependant ce n'est pas le cas. Ils ne sont pas classés par ordre alphabétique, par valeur ...

Alors, ma question est: comment cette liste est-elle triée?

Répondre

7

Tout d'abord, ne pas utiliser keys * il est fonction de débogage ne sont pas conçus pour une production, vous pouvez tuer votre serveur ... Si vous avez besoin d'énumérer toutes les clés de DB de manière sûre, utilisez la fonction SCAN avec LIMIT.

Quoi qu'il en soit, les résultats de keys ou scan ne sont pas triés de quelque manière que ce soit, dans l'ordre des résultats liés à la structure de la mémoire interne de la table de hachage redis.

A propos de votre script php, vous pouvez le faire par une seule commande, sans existssetexpireat il suffit d'exécuter:

SET key 1 EX 86400 NX

EX 86400 signifie-expireront à 86400 (1 jour) secondes à partir de maintenant

NX signifie créer une clé seulement si elle n'existe pas.

Si cette commande renvoie (nil), exécute régulièrement INCR key signifie que la clé existe déjà. La commande BTW INCR ne supprimera pas vos paramètres d'expiration.

+1

Une réponse presque parfaite - déracine un modèle diabolique, fournit la réponse à la question, et enseigne Redis propre - aurait augmenté deux fois si je le pouvais. Un dernier exemple pseudo PHP de ce que vous avez décrit l'aurait rendu parfait; p –

+0

Salut Itamar, je ne sais pas quel client il utilise :) BTW Ce serait bien d'avoir une tasse de café à l'occasion dans le nord de Tel-Aviv. Nous sommes voisins =) – h0x91B

+0

Juste point sur le client. Je serais heureux de le faire && choisir l'onglet (en supposant pas de dessert, naturellement) - contactez-moi et nous y arriverons. –