9
votes

Comment empêcher ASP.NET de supprimer des éléments du cache

Je veux ajouter définitivement un élément au cache. J'utilise la syntaxe suivante:

HttpContext.Current.Cache.Insert(cacheName, c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);


1 commentaires

Quelle est la taille du complexe? Ou sont-ils simplement des paramètres?


7 Réponses :


1
votes

Si vous voulez quelque chose de stocké en mémoire de manière permanente (c'est-à-dire pour la durée de vie de l'appdomain), un champ statique (dans votre cas, un dictionnaire ) est votre meilleur pari. < / p>

Une fois que le CLR a chargé le type contenant en mémoire votre dictionnaire sera maintenu en mémoire jusqu'à décharge de l'AppDomain.


0 commentaires

1
votes

Ma réponse n'est pas correcte. S'il vous plaît voir ici pour une réponse correcte.


Vous ne pouvez pas empêcher ASP.NET de supprimer des articles de Le cache (par exemple, lorsque la mémoire devient faible). p>

Si vous devez stocker des données pendant toute la durée de vie de l'application, placez-la dans la collection d'applicationsSTATE, par exemple: P>

Application["myData"] = ...;


2 commentaires

Tort. Voir la réponse de User134706 ci-dessous.


Malheureusement, je ne peux pas supprimer ma réponse (probablement parce que c'est la réponse acceptée)



1
votes

Vous ne pouvez jamais empêcher complètement quelque chose d'être retiré du cache ASP.NET (c'est-à-dire l'objet httpcontext.current.cache) et c'est beaucoup par conception.

Veuillez voir la section de l'article MSDN ASP.NET Vue d'ensemble de la mise en cache appelée "Suppression automatique des données", qui donne les informations les plus pertinentes concernant les éléments étant supprimés du cache.

Il étage:

ASP.NET peut supprimer les données du cache pour l'une de ces raisons:

  • Parce que la mémoire sur le serveur est faible, un processus appelé scavenging.
  • parce que l'élément du cache a expiré.
  • parce que la dépendance de l'élément change.

    Pour vous aider à gérer les éléments mis en cache, ASP.NET peut notifier votre application lorsque les éléments sont supprimés du cache.

    SCAVENGING est le processus de suppression des éléments du cache lorsque la mémoire est rare. Les éléments sont supprimés lorsqu'ils n'ont pas été accessibles depuis un certain temps ou lorsque des éléments sont marqués comme une priorité faible lorsqu'ils sont ajoutés au cache. ASP.NET utilise l'objet CacheTemPriority pour déterminer les éléments à récupérer en premier. Pour plus d'informations, voir Comment: Ajouter des éléments au cache.

    C'est pour cette raison (scavenging, si aucun autre) que vous ne pouvez jamais ne jamais compter absolument sur un élément que vous avez déjà placé dans le cache et l'a explicitement marqué avec une extinction de noslididing et de noabsoluteexpiration, et éventuellement même la marquée comme une priorité élevée. article, comme étant toujours là dans le cache à un moment ultérieur à temps.


0 commentaires

0
votes

Vous devez être prêt à gérer un cache Miss et à recharger les informations dans votre cache si nécessaire. Voir ici


0 commentaires

4
votes

Utilisez cache.Ajoud () et définissez la priorité cache extrêmement élevée (CacheTemPriority.notremovable), cela l'aidera à rester dans le cache. xxx pré>

System.Web.caching.CacheTemPriority.notremovable P>

Cela semble toujours ne pas le garantir dans le cache, mais il l'établit aussi si haut son hautement improbable que ce soit ... mais vous aurez toujours besoin de vérifier si c'est là et re-cache si non ... (On dirait que certaines personnes sur les entrées n'aiment pas utiliser ce haut réglage de cache ... et certains ... dépend de votre scénario exact, je suppose ...) P>

public static string GetSpecialObject
{
    get
    {
        object obj = HttpContext.Current.Cache["key"];
        if (obj  == null)
        {
            obj = HttpContext.Current.Cache.Add("key", 
                                            "I stay in cache as best i can object", // Build Object Function Here
                                            null, 
                                            Cache.NoAbsoluteExpiration, 
                                            Cache.NoSlidingExpiration, 
                                            CacheItemPriority.NotRemovable, 
                                            null);
        }
        return (string)obj;
    }
}


0 commentaires

22
votes

Vous ne pouvez pas empêcher ASP.NET de supprimer des éléments du cache (par exemple lorsque la mémoire devient faible).

Vous ne pouvez jamais empêcher complètement quelque chose d'être retiré du cache ASP.NET (c'est-à-dire l'objet httpcontext.current.cache) et c'est très bien par la conception.

faux! Vous pouvez empêcher que vos articles d'être supprimés du cache ASP.NET si vous marquez l'élément avec CacheItempPriority.notremovable. Chaque fois que toutes les autres données en cache (application, session, etc.) sont stockées dans le cache HTTPRuntime de cette façon.

Les gens ont toujours tendance à croire que même cette priorité n'empêche pas vos données d'expirer, mais cela est dû au manque de documentation appropriée. Je pense que la confussion vient avec la capacité de supprimer manuellement un tel élément du cache ou de l'élément supprimé en raison des dépendances qui y sont réglés.

Donc, si vous ne le supprimez jamais manuellement, et ne spécifiez jamais les dépendances qui peuvent l'obtenir supprimer, vous avez votre article là-bas pour la vie de l'AppDomain.


2 commentaires

Runtime, l'avez-vous testé? La réponse de BigBlondeviking indique que ce type d'articles pourrait toujours être supprimé.


Matra, oui je l'ai testé. La confusion vient avec la capacité d'éliminer manuellement un élément avec une telle priorité et de l'avoir automatiquement supprimé en spécifiant une expiration de temps ou une dépendance. Donc, NOTREMOVable ne signifie pas une fois que vous l'avez caché, il doit y rester pour la vie de l'AppDomain. Notre-estime signifie que la mise en œuvre de la SM ne supprimera pas un tel élément lorsque vous êtes faible en mémoire. C'est ainsi que l'état de la session InProC est tenu dans le cache. Si tous vos articles sont notremovables et que vous mettez en cache votre capacité MEM, vous obtiendrez une certaine détermination.



0
votes

Essayez de combiner la CacheTemProiority.notremovable option avec: xxx

ceci doit remplacer le paramètre machine.config.


1 commentaires

Vous devriez faire une réponse claire dans la section Réponse, cela ressemble plus à une autre question