2010-10-19 5 views
4

J'ai un simple compteur journalier sur mon site que je veux utiliser Redis comme datastore pour.Redis Track Hits

Tout simplement parce que redis a une date d'expiration, je n'ai pas besoin de configurer un cron pour effacer les données. De plus, je veux l'essayer. Je stocke les hits quotidiens sur une base d'URL.

Comment puis-je stocker les hits quotidiens pour une URL puis les faire expirer à la fin de la journée.

Par exemple:

 
incr today:www.google.com   >> 1 
incr today:www.google.com   >> 2 
incr today:www.google.com   >> 3 
incr today:www.yahoo.com   >> 1 
incr today:www.yahoo.com   >> 2 

Comment dois-je ces compteurs expirent à la fin de la journée? Si j'expire, cela réinitialise les compteurs. J'ai l'impression que mon processus de réflexion est éteint. Est-ce que je fais des choses à l'envers?

+0

Malheureusement toutes les solutions que je peux penser, il faudrait au moins un script et Cron -. Il n'y a aucun moyen de dire Redis d'effectuer une action lorsqu'une clé arrive à expiration qui est construit dans –

Répondre

7

Vous devez utiliser la date actuelle comme clé plutôt que "aujourd'hui".

Définissez un hachage pour la date actuelle, chaque URL étant une clé dans ce hachage. Votre mise à jour serait alors

HINCRBY 101021 www.google.com 1

et vous pouvez utiliser la commande DEL pour supprimer toute hachage pour une journée une fois que vous ne souhaitez plus conserver les données - peut-être mettre en place un Script déclenché manuellement qui appelle DEL pour tout ce qui a entre 1 et 2 mois.

Définir l'expiration sur le hachage fonctionnerait probablement même si je ne l'ai pas essayé - en utilisant une clé différente pour chaque jour signifie que vous ne comptez pas sur l'expiration se produisant à un moment précis comme vous le feriez avec un "aujourd'hui" clé.

+0

I pense que vous avez raison à propos de la date actuelle. Cela signifie que je peux stocker toutes les données pour chaque jour, je peux aussi le faire pour le mois et l'année. – Mark

+0

En outre, la commande EXPIRE n'est pas aussi bonne que je le pensais, je pouvais soit supprimer les clés quand elles deviennent obsolètes comme vous le suggérez. – Mark

2

Une autre option consiste à utiliser redis> = 2.1.3. À partir de cette version, expire fonctionne comme vous le souhaitez. J'utilise 2.1.5 (de git) pour faire la même chose. J'utilise les deux expire et une méthode similaire à ce que Tom décrit. Je place la date dans la clé, et je mets une expiration. Avec redis> = 2.1.3, vous pouvez définir expire sur une clé incrémentée sans réinitialiser le compteur.

La raison pour les deux est a) Je stocke plus d'un jour et b) si les clés expirées sont toujours là pour une raison quelconque, je ne les interroge pas pour obtenir des statistiques pour aujourd'hui. Par exemple, le hash: SERVER avec la clé YEAR: MONTH: DAY: l'URL est incrémentée et l'expiration est définie pour aujourd'hui + 3 jours. Fonctionne comme un charme.

1

j'ai fait solution récemment pour analyse intégrée dans mon application:

incr www.google.com 1 

puis la nuit, dans une tâche cron:

getset www.google.com 0 

retourne GetSet atomiquement la valeur et fixe à la nouvelle valeur, ce qui réinitialise vos jetons sans manquer un seul coup.

J'arrive aussi:

lpush yearly:www.google.com <value from getset> 
ltrim yearly:www.google.com 0 364 (this is optional) 

ce qui met la valeur « la nuit dernière » sur une liste. la liste est éventuellement rognée pour stocker jusqu'à des valeurs d'un an.(Ceci est vraiment efficace quand on fait des sparklines de 60 minutes)

0

Une option plus simple serait comme suggéré, pour utiliser la date actuelle. Ce que je fais est d'utiliser le jour du mois de l'année comme clé. Mais plutôt que d'utiliser un hachage, je simplifie les choses en ajoutant la page à la date comme clé.

Par exemple:

 
INCR 20110425:www.google.com 
INCR 20110424:www.yahoo.com 
... 
INCR 20110426:www.google.com 

Pour faciliter de récupérer des informations après une autre solution que je l'utilise, le cas échéant est de stocker les informations dans un ensemble trié.

Par exemple:

 
$rank = ZRANK hits:www.google.com 20110425 
ZADD hits:www.google.com ($rank + 1) 20110425 

Avec cette variante, vous pouvez simplement demander ce qui suit pour obtenir tous les résultats pour www.google.com:

 
ZRANGE hits:www.google.com 0 -1 

ou

 
ZREVRANGE hits:www.google.com 0 -1 

ou

 
SORT hits:www.google.com ... 

Hope this est une aide