2012-03-15 3 views
1

Je suis vraiment nouveau à Redis et je l'ai utilisé avec mon application Rubis on Rails (Rails 2.3 et Ruby 1.8.7) en utilisant la gemme redis pour une fonctionnalité de marquage simple comme magasin de valeur clé. J'ai récemment réalisé que je pouvais aussi l'utiliser pour gérer un flux d'activité utilisateur. Le fait est que j'ai besoin des données de marquage (stockées comme clé => Ensembles) en mémoire et qu'il est extrêmement important de déterminer les résultats pour les opérations liées au marquage, où les données pourraient être supprimées en premier sur la base. En supposant que je stocke X nombre d'activités pour chaque utilisateurNotions de base sur les espaces de noms Redis

Est-il possible que je puisse nommer les ensembles de données redis et en avoir un restent en permanence en mémoire et que l'autre reste temporairement dans la mémoire. Quelle est l'approche générale lorsque l'on utilise des ensembles de données sans rapport qui doivent avoir des durées de survie différentes en mémoire.

J'apprécierais vraiment toute aide à ce sujet.

Répondre

5

Vous n'avez pas besoin de définir un espace de noms spécifique pour cela. Avec Redis, vous pouvez utiliser la commande EXPIRE pour définir un délai d'expiration clé par clé.

La politique générale concernant l'expiration clé est définie dans le fichier de configuration:

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory 
# is reached? You can select among five behavior: 
# 
# volatile-lru -> remove the key with an expire set using an LRU algorithm 
# allkeys-lru -> remove any key accordingly to the LRU algorithm 
# volatile-random -> remove a random key with an expire set 
# allkeys->random -> remove a random key, any key 
# volatile-ttl -> remove the key with the nearest expire time (minor TTL) 
# noeviction -> don't expire at all, just return an error on write operations 
# 

Pour votre objectif, la politique volatile LRU doit être réglé.

Il suffit d'appeler EXPIRE sur les touches que vous voulez volatiles, et laissez-les expulser. Cependant, veuillez noter qu'il est difficile de garantir que les clés les plus anciennes seront expulsées une fois que le délai d'attente a été déclenché. Plus d'explications here.

Pour votre cas d'utilisation spécifique, cependant, je n'utiliserais pas l'expiration de clé mais plutôt essayer de simuler des collections plafonnées. Si le flux d'activité pour un utilisateur donné est représenté sous la forme d'une liste d'objets, il est facile de LPUSH les objets d'activité et d'utiliser LTRIM pour limiter la taille de la liste. Vous obtenez un comportement FIFO et gardez la consommation de mémoire sous contrôle gratuitement.

MISE À JOUR:

Maintenant, si vous avez vraiment besoin d'isoler les données, vous avez deux possibilités principales avec Redis:

  • en utilisant deux bases de données distinctes. Les bases de données Redis sont identifiées par un entier, et vous pouvez en avoir plusieurs par instance. Utilisez le select command pour basculer entre les bases de données. Les bases de données peuvent être utilisées pour isoler des données, mais pas pour leur attribuer des propriétés différentes (comme une politique d'expiration par exemple).

  • en utilisant deux instances distinctes. Une instance Redis vide est un processus très léger. Ainsi, plusieurs d'entre eux peuvent être démarrés sans problème. C'est en fait le moyen le meilleur et le plus évolutif pour isoler les données avec Redis. Chaque instance peut avoir ses propres politiques (y compris la politique d'expulsion). Les clients doivent ouvrir autant de connexions que d'instances.

Mais encore une fois, vous n'avez pas besoin d'isoler les données pour mettre en œuvre vos exigences de politique d'expulsion.

+0

Merci Didier mais existe-t-il un moyen de séparer les clés utilisées pour le marquage de celles qui sont utilisées pour le flux d'activité. Est-il possible que je puisse empêcher ces clés d'expirer par une politique d'expiration.Comment utilise-t-on Redis lorsque l'on travaille avec deux ensembles de données distincts qui ne sont aucunement liés. – Sid

+0

C'était mon point: vous n'avez pas à les séparer. Utilisez simplement la commande EXPIRE sur celles qui devraient expirer. Maintenant, si vous voulez vraiment isoler des données, vous avez deux options: différentes bases de données ou différentes instances. Je mets à jour ma réponse. –