Persister les données en cache après le retrait / l'expulsion à l'aide de MemCache API Compatible Store

StackOverflow https://stackoverflow.com//questions/11694398

  •  12-12-2019
  •  | 
  •  

Question

Cette question concerne spécifiquement Cachbase, mais je crois que cela s'appliquerait à tout ce qui concerne l'API memcached.

permet, disons que je crée une application de chat de client / serveur, et sur mon serveur, je stocke des informations de session de discussion pour chaque utilisateur dans un godet de données.Après la séance de discussion terminée, je supprimerai l'objet de session du godet de données, mais je souhaite également la persister à un magasin de données NOSQL permanent à des fins de rapport et d'analyse.Je souhaite également que des objets de session soient persistants sur l'expulsion de cache, lorsque les sessions délai d'attente, etc.

Y a-t-il une sorte de "meilleure pratique" (ou même une fonction de Cachbase qui me manque) qui me permet de le faire efficacement et de maintenir la meilleure performance possible de mon système de mise en cache de mémoire?

Était-ce utile?

La solution

Utilisation de CouchBase Server 2.0, vous pouvez configurer deux godets (ou deux clusters distincts si vous souhaitez séparer les ressources physiques). Sur le cluster de session, vous stockiez les documents JSON (la valeur de la liste de clés / valeur), peut-être comme suit:

{ 
  "sessionId" : "some-guid",
  "users" : [ "user1", "user2" ],
  "chatData" : [ "message1", "message2"],
  "isActive" : true,
  "timestamp" : [2012, 8, 6, 11, 57, 00]
}

Vous pouvez alors écrire une carte de carte / réduction de la base de données de session qui vous donne une liste de tous les éléments expirés (notez que l'exemple ci-dessous avec l'argument Meta nécessite une version récente de CouchBase Server 2.0 - pas le DP4.

function(doc, meta) {
  if (doc.sessionId && ! doc.isActive) {
    emit(meta.id, null);
  }
}

Ensuite, en utilisant la bibliothèque client de CouchBase que vous préférez, vous pouvez avoir une tâche pour interroger la vue, obtenir les éléments et les déplacer dans le cluster Analytics (ou le godet). Donc, en C #, cela ressemblerait à quelque chose comme:

var view = sessionClient.GetView("sessions", "all_inactive");
foreach(var item in view) 
{
   var doc = sessionClient.Get(item.ItemId);
   analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
   sessionClient.Remove(item.ItemId);
}

Si vous aurez plutôt voulu utiliser un horodatage ou une expiration explicite, votre vue pourrait indiquer en fonction de l'horodatage:

function(doc) {
   if (doc.sessionId && ! doc.isActive) {
      emit(timestamp, null);
   }
}

Votre tâche pourrait ensuite interroger la vue en incluant une startkey pour renvoyer tous les documents qui n'ont pas été touchés dans X jours.

var view = sessionClient.GetView("sessions", "all_inactive").StartKey(new int[] { DateTime.Now.Year, DateTime.Now.Months, DateTime.Now.Days-1);

foreach(var item in view)
{
   var doc = sessionClient.Get(item.ItemId);
   analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
   sessionClient.Remove(item.ItemId);
}

Checkout http://www.couchbase.com/couchbase-server/next Pour plus d'informations sur CouchBase Server 2.0 et si vous avez besoin d'une clarification sur cette approche, faites-le-moi savoir sur ce fil.

- Jean

Autres conseils

STOCKAGE COUCHDB est (éventuellement) persistant et sans mécanisme d'expiration intégré, donc tout ce que vous stockez, il restera stocké jusqu'à ce que vous le supprimiez - ce n'est pas comme dans MemCached où vous pouvez définir le délai d'attente pour les données stockées. Donc, si vous stockez une session dans Couchdb, vous devrez les supprimer à vous-même quand ils expirent et car ce n'est pas un mécanisme automatisé, mais quelque chose que vous faites vous-même, il n'y a aucune raison pour vous de ne pas enregistrer des données partout où vous le souhaitez à lamême temps.

BTH Je ne vois aucun avantage d'utiliser NOSQL persistant sur SQL pour le stockage de session (et inversement) - La performance des deux sera io liée.La mémoire que la mémoire de clé ou une solution hybride est une histoire complète.

Tant que votre problème: Déplacez les données dans votre session d'applications Expiration / session Fermer le mécanisme et / ou exécutez un travail cron qui vérifie périodiquement le stockage de la session pour des sessions expirées et déplacez les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top