<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cluster - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/tag/cluster/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Mon, 01 Oct 2012 10:35:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>Cluster - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Prise en main du cache distribué Microsoft AppFabric</title>
		<link>https://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=prise-en-main-du-cache-distribue-microsoft-appfabric</link>
					<comments>https://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040#comments</comments>
		
		<dc:creator><![CDATA[Grégory Ghez]]></dc:creator>
		<pubDate>Wed, 03 Oct 2012 10:03:00 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[AppFabric]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Cache Distribué]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[NuGet]]></category>
		<category><![CDATA[Velocity]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2040</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">8</span> <span class="rt-label rt-postfix">min.</span></span> Microsoft AppFabric, anciennement nommé Velocity dans ses versions beta, est un cache distribué. Pour schématiser, il s&#8217;agit d&#8217;une HashTable partagée via une connectivité réseau. Dans son produit, Microsoft propose une utilisation sous la forme d&#8217;un cluster d&#8217;hôtes permettant ainsi une montée en charge facile d&#8217;installation. Parmi les fonctionnalités proposées : Support d&#8217;un nombre de serveurs allant &#8230;</p>
<p>The post <a href="https://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040">Prise en main du cache distribué Microsoft AppFabric</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">8</span> <span class="rt-label rt-postfix">min.</span></span><p><strong>Microsoft AppFabric</strong>, anciennement nommé <strong>Velocity</strong> dans ses versions beta, est un cache distribué. Pour schématiser, il s&#8217;agit d&#8217;une <em><strong>HashTable</strong></em> partagée via une connectivité réseau.</p>
<p>Dans son produit, Microsoft propose une utilisation sous la forme d&#8217;un cluster d&#8217;hôtes permettant ainsi une montée en charge facile d&#8217;installation. Parmi les fonctionnalités proposées :</p>
<ul>
<li>Support d&#8217;un nombre de serveurs allant de 2 à plus d&#8217;une centaine</li>
<li>Redimensionnement dynamique du cluster (ajout/suppression de noeuds) sans interruption de service</li>
<li>Load-balancing automatique : le service distribue de manière autonome les travaux aux différents noeuds du cluster</li>
<li>Haute disponibilité : les données sont répliquées sur les hôtes du cluster</li>
<li>Intégration des sessions ASP.NET</li>
</ul>
<p>L&#8217;API permettant la consommation du cache AppFabric se veut extrêmement épurée. Il en résulte une prise en main rapide et une mise en place peu coûteuse en temps.</p>
<p>Enfin, le serveur ainsi que l&#8217;API client sont disponibles gratuitement au téléchargement. Vous pouvez suivre les liens présents dans la suite de l&#8217;article.<span id="more-2040"></span></p>
<h2>Installation</h2>
<h3>Serveur</h3>
<p>Pour commencer, il faudra télécharger l’installer disponible sur le site de téléchargement de Microsoft à cette adresse : <a href="http://www.microsoft.com/fr-fr/download/details.aspx?id=27115">http://www.microsoft.com/fr-fr/download/details.aspx?id=27115</a></p>
<p><em>L’installer fait environ 30 Mo, et la version utilisé dans cet article est la 1.1.0.0</em></p>
<p>Voici le premier écran d’installation :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/AppFabric-1.1-for-Windows-Server-Setup-Wizard_1.jpg" class="fancyboxgroup" rel="gallery-2040"><img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-2081" src="https://blog.infine.com/wp-content/uploads/2012/09/AppFabric-1.1-for-Windows-Server-Setup-Wizard_1-300x225.jpg" alt="" width="300" height="225" srcset="https://blog.infine.com/wp-content/uploads/2012/09/AppFabric-1.1-for-Windows-Server-Setup-Wizard_1-300x225.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/AppFabric-1.1-for-Windows-Server-Setup-Wizard_1.jpg 622w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Passez les étapes et effectuez une installation complète, afin d’éviter de devoir relancer l’installer dans le futur.</p>
<p>Une fois installé, l’outil de configuration de AppFabric Server se lance. Passez les étapes jusqu’à cet écran:<a href="https://blog.infine.com/wp-content/uploads/2012/09/screen-2.png" class="fancyboxgroup" rel="gallery-2040"><img decoding="async" class="aligncenter size-medium wp-image-2086" src="https://blog.infine.com/wp-content/uploads/2012/09/screen-2-300x226.png" alt="" width="300" height="226" srcset="https://blog.infine.com/wp-content/uploads/2012/09/screen-2-300x226.png 300w, https://blog.infine.com/wp-content/uploads/2012/09/screen-2.png 628w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Sans oublier de configurer la base de données en cliquant sur le bouton “Configure”. Veillez à ne pas donner un nom de base de données déjà existant, l’outil se charge de la créer et de la remplir.</p>
<p>Notez également qu’il vous est offert la possibilité de sauvegarder la configuration du serveur dans un fichier XML,  selon vos préférences.</p>
<p>Laissez les pots de communication par défaut, sauf nécessité réseau particulière.</p>
<p>Une fois l&#8217;installation terminée, vous pourrez constater la présence de 3 nouveaux services Windows dans le gestionnaire de services :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/Services.jpg" class="fancyboxgroup" rel="gallery-2040"><img decoding="async" class="aligncenter size-medium wp-image-2052" src="https://blog.infine.com/wp-content/uploads/2012/09/Services-300x25.jpg" alt="" width="300" height="25" srcset="https://blog.infine.com/wp-content/uploads/2012/09/Services-300x25.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/Services.jpg 809w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Ainsi qu’une nouvelle section dans le IIS Manager permettant de monitorer le serveur AppFabric:</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/Internet-Information-Services-IIS-Manager.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2061" src="https://blog.infine.com/wp-content/uploads/2012/09/Internet-Information-Services-IIS-Manager-300x91.jpg" alt="" width="300" height="91" srcset="https://blog.infine.com/wp-content/uploads/2012/09/Internet-Information-Services-IIS-Manager-300x91.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/Internet-Information-Services-IIS-Manager.jpg 418w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2>Outil d’administration du cache</h2>
<p>Il n’y a pas d’outil d’administration fourni avec le serveur, mais vous pouvez télécharger par exemple AppFabric Caching Admin Tool (<a href="http://mdcadmintool.codeplex.com/">http://mdcadmintool.codeplex.com/</a>).</p>
<p>L’outil est à copier dans un dossier, il suffit de lancer le .exe :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/admin-tool.png" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2089" src="https://blog.infine.com/wp-content/uploads/2012/09/admin-tool-300x94.png" alt="" width="300" height="94" srcset="https://blog.infine.com/wp-content/uploads/2012/09/admin-tool-300x94.png 300w, https://blog.infine.com/wp-content/uploads/2012/09/admin-tool.png 420w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Une fois l’outil lancé, sur notre serveur AppFabric nouvellement installé, vous pourrez constater la présence de l’hôte principal (sur la machine locale) ainsi que la liste des caches qu’il contient :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/Microsoft-Distributed-Cache-MDC-Admin-Tool.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2068" src="https://blog.infine.com/wp-content/uploads/2012/09/Microsoft-Distributed-Cache-MDC-Admin-Tool-300x200.jpg" alt="" width="300" height="200" srcset="https://blog.infine.com/wp-content/uploads/2012/09/Microsoft-Distributed-Cache-MDC-Admin-Tool-300x200.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/Microsoft-Distributed-Cache-MDC-Admin-Tool.jpg 900w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nous allons créer un cache autre que celui créé par défaut pour les besoins des exemples d’utilisation du cache qui vont suivre.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2069" src="https://blog.infine.com/wp-content/uploads/2012/09/New-Cache-Name.jpg" alt="" width="300" height="280" /></p>
<p>Notez bien que j’ai volontairement activé les notifications, afin de pouvoir utiliser ce mécanisme dans la dernière démonstration.</p>
<p>Créez également 2 régions dans ce cache : “RegionA” (sans eviction) et “RegionB” (avec éviction). Nous reviendrons plus tard sur ce paramètre.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2072" src="https://blog.infine.com/wp-content/uploads/2012/09/Add-Region.jpg" alt="" width="260" height="170" /></p>
<p><span style="color: #ff0000"><strong>Si vous rencontrez des difficultés lors de la création de nouveaux caches ou bien de régions, vérifiez que le service “Remote Registry” sur votre machine (celle où se trouve le serveur AppFabric) est lancé.</strong></span></p>
<p>Définissons désormais les droits d’accès au cache pour l’utilisateur qui consommera ce dernier. Pour ce faire, cliquez sur le noeud racine “Cluster : AppFabric” puis sur le bouton “Security” en haut à droite. Dans la fenêtre de saisie, entrez le nom de l’utilisateur sous la forme : “DOMAIN\user”, c’est tout.</p>
<h3>Client</h3>
<p>La plus simple façon d’installer les assemblies client pour AppFabric est de passer par le gestionnaire de packages NuGet. Si vous ne l’avez pas installé, c’est simple :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2053" src="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio.jpg" alt="" width="359" height="311" srcset="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio.jpg 359w, https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio-300x259.jpg 300w" sizes="(max-width: 359px) 100vw, 359px" /></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/Extension-Manager.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2054" src="https://blog.infine.com/wp-content/uploads/2012/09/Extension-Manager-300x207.jpg" alt="" width="300" height="207" srcset="https://blog.infine.com/wp-content/uploads/2012/09/Extension-Manager-300x207.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/Extension-Manager.jpg 955w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Dans la capture d’écran ci-dessus, NuGet est déjà installé, le cas contraire un bouton “Install” est disponible.</p>
<p>Une fois cet outil installé, il suffit de taper dans la console NuGet la ligne de commande d’installation du client AppFabric (<a href="http://nuget.org/packages/ServerAppFabric.Client">http://nuget.org/packages/ServerAppFabric.Client</a>) :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2055" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-300x97.jpg" alt="" width="300" height="97" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-300x97.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture.jpg 571w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Pour afficher cette console :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_2.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2056" src="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_2-300x134.jpg" alt="" width="300" height="134" srcset="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_2-300x134.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_2.jpg 650w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2>Utilisation</h2>
<p>Nous allons pour ce faire créer une application Console. Si vous avez utilisé NuGet pour obtenir votre package AppFabric client, les références aux assemblies d’AppFabric sont déjà rajoutées à la solution, dans le cas contraire, ajoutez manuellement ces dernières, comme sur cet exemple :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2057" src="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_4.jpg" alt="" width="340" height="320" srcset="https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_4.jpg 340w, https://blog.infine.com/wp-content/uploads/2012/09/ConsoleApplication2-Microsoft-Visual-Studio_4-300x282.jpg 300w" sizes="(max-width: 340px) 100vw, 340px" /></p>
<p>Placez ensuite un fichier App.config à la racine du projet contenant au minimum ceci :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section
        name=&quot;dataCacheClient&quot;
        type=&quot;Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot;
        allowLocation=&quot;true&quot;
        allowDefinition=&quot;Everywhere&quot; /&gt;
  &lt;/configSections&gt;
  &lt;dataCacheClient&gt;
    &lt;hosts&gt;
      &lt;host name=&quot;localhost&quot; cachePort=&quot;22233&quot;/&gt;
    &lt;/hosts&gt;
    &lt;clientNotification pollInterval=&quot;1&quot; /&gt;
  &lt;/dataCacheClient&gt;
  &lt;startup&gt;&lt;supportedRuntime version=&quot;v4.0&quot; sku=&quot;.NETFramework,Version=v4.0&quot;/&gt;&lt;/startup&gt;
&lt;/configuration&gt;
</pre>
<p>Remplacez bien entendu “localhost” par le nom d’hôte qui correspond à votre installation et le port par celui que vous avez configuré (22233 est le port par défaut). J’ai également défini le “pollInterval” (délai entre deux notifications) à 1 seconde au lieu de 300s par défaut. <span style="color: #ff0000"><strong>Attention ici il s’agit bien ici de secondes et non de millisecondes.</strong></span></p>
<h3>Premiers pas</h3>
<p>L’exemple ci-dessous illustre la durée de rétention du cache appliquée aux objets stockés :</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestBasicExpiration()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetDefaultCache();

    cache.Put(&quot;obj&quot;, new object(), TimeSpan.FromSeconds(5));

    var timer = new Timer(new TimerCallback(o =&gt;
    {
        Console.WriteLine(&quot;obj : {0}&quot;, cache.Get(&quot;obj&quot;));
    }), null, 0, 1000);
}
</pre>
<p>La sortie console est la suivante :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2075" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3.jpg" alt="" width="450" height="164" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3.jpg 450w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3-300x109.jpg 300w" sizes="(max-width: 450px) 100vw, 450px" /></p>
<p>Une fois passées les 5 secondes définies comme durée de persistance pour l’objet portant la clé “obj”, ce dernier est détruit et l’appel la clé “obj” ne renvoie plus rien.</p>
<p>Les deux ligne suivantes peuvent être isolées afin de ne pas avoir à redemander ces informations statiques à chaque requête d’objets du cache :</p>
<pre>var factory = new DataCacheFactory();
var cache = factory.GetDefaultCache();</pre>
<p><strong><em>GetDefaultCache</em></strong> renvoie, comme son nom l’indique, le cache par défaut de l’hôte AppFabric. Pour accéder à un cache nommé, il suffit de remplacer cet appel par <strong><em>GetCache(</em></strong><em>“InfineCache”<strong>)</strong></em> par exemple.</p>
<h3>Utilisation des régions</h3>
<p>Il est possible de stocker des objets dans le cache sous différentes régions :</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestRegion()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    cache.Put(&quot;int&quot;, 5);
    cache.Put(&quot;int&quot;, 6, &quot;RegionA&quot;);
    cache.Put(&quot;int&quot;, 7, &quot;RegionB&quot;);

    Console.WriteLine(&quot;int(no region) : {0}&quot;, cache.Get(&quot;int&quot;));
    Console.WriteLine(&quot;int(RegionA) : {0}&quot;, cache.Get(&quot;int&quot;, &quot;RegionA&quot;));
    Console.WriteLine(&quot;int(RegionB) : {0}&quot;, cache.Get(&quot;int&quot;, &quot;RegionB&quot;));
}
</pre>
<h3>Les notifications</h3>
<p>Le système de notification de AppFabric est basé sur l’attachement d’un delegate à un ensemble de filtres d’opérations. Il est possible de s’attacher au cache, à une région du cache ou bien à une clé d’objet précise.</p>
<p>Voici l’exemple :</p>
<pre class="brush: csharp; title: ; notranslate">
static void CacheUpdated(string cacheName, string region, string key,
DataCacheItemVersion version, DataCacheOperations operation,
DataCacheNotificationDescriptor descriptor)
{
    //display some of the delegate parameters
    Console.WriteLine(&quot;A cache-level notification was triggered!&quot;);
    Console.WriteLine(&quot;    Cache: &quot; + cacheName);
    Console.WriteLine(&quot;    Region: &quot; + region);
    Console.WriteLine(&quot;    Key: &quot; + key);
    Console.WriteLine(&quot;    Operation: &quot; + operation);
    Console.WriteLine(&quot;======================================================&quot;);
}

static void TestNotifications()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    var rnd = new Random();
    cache.Put(&quot;int&quot;, rnd.Next());

    var allCacheOperations = DataCacheOperations.AddItem | DataCacheOperations.ReplaceItem |
        DataCacheOperations.RemoveItem | DataCacheOperations.CreateRegion |
        DataCacheOperations.ClearRegion | DataCacheOperations.RemoveRegion;

    cache.AddCacheLevelCallback(allCacheOperations,
            new DataCacheNotificationCallback(CacheUpdated));

    cache.Remove(&quot;int&quot;);
    cache.Put(&quot;int&quot;, rnd.Next());
    cache.Put(&quot;int&quot;, rnd.Next());
}
</pre>
<p>Et la sortie résultante :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2076" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-2.jpg" alt="" width="491" height="276" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-2.jpg 491w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-2-300x168.jpg 300w" sizes="(max-width: 491px) 100vw, 491px" /></p>
<h3>Opérations Bulk</h3>
<p>Les opérations de type “Bulk” dans AppFabric se limitent à la lecture, il n’y a pour le moment aucun moyen d’effectuer des écritures de masse dans le cache.</p>
<p>La lecture se fait grâce à l’instruction <strong><em>BulkGet</em></strong> de l’objet <strong><em>DataCache</em></strong> :</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestBulkGet()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    cache.CreateRegion(&quot;Desk&quot;);

    var rnd = new Random();
    for (var i = 0; i &lt; 1000; i++)
    {
        cache.Put(&quot;int-&quot; + i, rnd.Next(), &quot;Desk&quot;);
    }

    var gets = cache.BulkGet(new&#x5B;] { &quot;int-6&quot;, &quot;int-14&quot;, &quot;int-578&quot;, &quot;int-988&quot; }, &quot;Desk&quot;);
    foreach (var value in gets)
    {
        Console.WriteLine(&quot;{0} = {1}&quot;, value.Key, value.Value);
    }
}
</pre>
<p>Résultat :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2077" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-2.jpg" alt="" width="353" height="122" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-2.jpg 353w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-2-300x103.jpg 300w" sizes="(max-width: 353px) 100vw, 353px" /></p>
<h3>Lock / Unlock</h3>
<p>Il est possible de vérouiller une donnée du cache pour une durée spécifique au moment où on la récupère via l’instruction <strong><em>GetAndLock</em></strong> de l’objet <strong><em>DataCache</em></strong> . Attention cependant, un appel <strong><em>Put</em></strong> sur la clé de l’objet réinitialisera le verrou. De même, un appel à <strong><em>Get</em></strong> ne générera pas d’exception, car ce dernier ne demande pas d’autorisation sur la clé comme le fait <strong><em>GetAndLock</em></strong>.</p>
<p>L’utilisation de <strong><em>GetAndLock</em></strong> combiné avec <strong><em>PutAndUnlock</em></strong> peut s’apparenter à l’utilisation de verrou dans un système multithreading, à la différence que les verrous persistent sur le cache distribué et non sur la machine exécutant le code. <strong>Les verrous sont donc communs à tous les utilisateurs du cache.</strong></p>
<p>Illustration :</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestLock()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    cache.Put(&quot;int&quot;, 5);

    DataCacheLockHandle lockHandle;
    var value = cache.GetAndLock(&quot;int&quot;, TimeSpan.FromSeconds(5), out lockHandle);
    Console.WriteLine(&quot;GetAndLock: int = {0}&quot;, value);

    try
    {
        value = cache.GetAndLock(&quot;int&quot;, TimeSpan.FromSeconds(5), out lockHandle);
        Console.WriteLine(&quot;GetAndLock: int = {0}&quot;, value);
    }
    catch (DataCacheException ex)
    {
        if (ex.ErrorCode == DataCacheErrorCode.ObjectLocked)
            Console.WriteLine(&quot;GetAndLock failed, object already locked.&quot;);
        else
            throw ex;
    }

    var timer = new Timer(new TimerCallback(o =&gt;
    {
        Console.WriteLine(&quot;GetAndLock(after 6s): int = {0}&quot;, cache.GetAndLock(&quot;int&quot;, TimeSpan.FromSeconds(5), out lockHandle));
    }), null, 6000, Timeout.Infinite);
}
</pre>
<p>Sortie :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2078" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3-2.jpg" alt="" width="436" height="126" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3-2.jpg 436w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_3-2-300x86.jpg 300w" sizes="(max-width: 436px) 100vw, 436px" /></p>
<h3>Information sur un objet du cache</h3>
<p>La fonction <strong><em>GetCacheItem</em></strong> de la classe <strong><em>DataCache</em></strong> renvoie une instance de <strong><em>DataCacheItem</em></strong> regroupant quelques informations sur l’objet mis en cache.</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestCacheItem()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    cache.Put(&quot;int&quot;, 5, TimeSpan.FromSeconds(15));

    var item = cache.GetCacheItem(&quot;int&quot;);
    Console.WriteLine(&quot;CacheItem informations :&quot;);

    foreach (var prop in item.GetType().GetProperties())
    {
        Console.WriteLine(&quot;{0} = {1}&quot;, prop.Name, prop.GetValue(item, null));
    }
}
</pre>
<p>Sortie :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-3.jpg" class="fancyboxgroup" rel="gallery-2040"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2079" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-3-300x80.jpg" alt="" width="300" height="80" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-3-300x80.jpg 300w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture-3.jpg 677w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h3>Recherche dans le cache</h3>
<p>La recherche dans le cache peut se faire grâce aux méthodes <strong><em>GetObjectsByTag</em></strong>, <strong><em>GetObjectsByAllTags</em></strong>, <strong><em>GetObjectsByAnyTag</em></strong> et <strong><em>GetObjectsInRegion</em></strong>.</p>
<p>Exemple :</p>
<pre class="brush: csharp; title: ; notranslate">
static void TestSearch()
{
    var factory = new DataCacheFactory();
    var cache = factory.GetCache(&quot;InfineGroup&quot;);

    cache.CreateRegion(&quot;Desk&quot;);
    var rnd = new Random();

    for (var i = 0; i &lt; 1000; i++)
    {
        var tagParite = new DataCacheTag(i % 2 == 0 ? &quot;Paire&quot; : &quot;Impaire&quot;);
        var tagRandom = new DataCacheTag(rnd.Next(100).ToString());

        cache.Put(&quot;int-&quot; + i, i, new&#x5B;] { tagParite, tagRandom }, &quot;Desk&quot;);
    }

    foreach (var pair in cache.GetObjectsByTag(new DataCacheTag(&quot;67&quot;), &quot;Desk&quot;))
    {
        var item = cache.GetCacheItem(pair.Key, &quot;Desk&quot;);
        Console.WriteLine(&quot;{0} : {1} &#x5B;Tag: {2}]&quot;, pair.Key, pair.Value, string.Join(&quot;,&quot;, item.Tags));
    }
}
</pre>
<p>Sortie :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2080" src="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-3.jpg" alt="" width="365" height="201" srcset="https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-3.jpg 365w, https://blog.infine.com/wp-content/uploads/2012/09/PrtScr-capture_2-3-300x165.jpg 300w" sizes="(max-width: 365px) 100vw, 365px" /></p>
<h2>Ressources</h2>
<p>Examples C# : <a href="https://github.com/gg00xiv/infine/blob/master/AppFabricTests.zip?raw=true">AppFabricTests.zip</a></p>
<p>Liens MSDN :</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ee790941%28v=azure.10%29.aspx">Developing a Cache Client</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff921012%28v=azure.10%29.aspx">Managing Security</a></li>
</ul><p>The post <a href="https://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040">Prise en main du cache distribué Microsoft AppFabric</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
