Les clés de cache Httpruntime ne sont pas uniques?
Question
Bien que j'ai spécifié une clé unique, il semble que le code suivant renvoie une valeur pour 5 demandes, puis une autre pour le couple suivant, puis revienne à la valeur enregistrée dans la demande d'origine et continue jusqu'à ce qu'il y ait 10 différents objets tous stockés sous la même clé. Il semble alors presque aléatoire laquelle de ces valeurs sera renvoyée du cache.
string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
strDateTime = (string)cachedobject;
else
{
strDateTime = DateTime.Now.ToString();
HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +" keys:"+ HttpRuntime.Cache.Count);
Très confus, est-ce à cause du filetage ou autre chose?
La solution
Ignorant la possibilité d'une batterie de serveurs et d'un équilibrage de charge, ce problème peut être provoqué par l'exécution du pool d'applications en tant que web-garden . Pour citer la section pertinente de MSDN:
Parce que les jardins Web permettent l’utilisation de plusieurs processus, chaque processus avoir sa propre copie de l'application état, état de la session en cours, les caches et les données statiques. Jardins Web ne devrait pas être utilisé pour tous applications, surtout si elles ont besoin maintenir l'état. Assurez-vous de comparer les performances du demande avant de décider si Le mode jardin Web est approprié.
Cela fera apparaître comme si la mise en cache stockait plusieurs valeurs pour la même clé, avec des entrées en double dans le cache.
Pour résoudre ce problème dans IIS 7, ouvrez les Paramètres avancés du pool d'applications et définissez Nombre maximal de processus de travail sur 1. Pour IIS 6, consultez la section Article MSDN (avec jolis screenshots).
Avec 8 mois de retard, je réponds à cette question car je l’avais trouvée bien avant que je trouve cet article décent sur les pièges du jardin Web . Espérons que cette réponse permettra aux futurs chercheurs d’économiser beaucoup de temps. :)
Autres conseils
Votre clé de cache est toujours 'datetimeexample', par conséquent, vous aurez toujours un objet dans le cache; et vous recevrez toujours cet objet en retour.
Je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir ici, en ce qui me concerne, cela se comporte exactement comme il est censé le faire.