Spring.Netテクノロジーによる切り替え可能な分散キャッシュ読み書きクラスの構築

18163 ワード

Spring.Netテクノロジーによる切り替え可能なMemcached分散キャッシュ読み書きクラスの構築
Memcachedは高性能の分散メモリオブジェクトキャッシュシステムであり、メモリで動作するため、読み書き速度はデータベースよりも高いのは一般的ではなく、Radisと同様に効率的な読み書きと分散の利点があり、前のブログ「WindowsでのMemcachedの構成と使用」ではwindowsでの構成と使用について説明しています.
新しいICacheWriterクラス--CacheWriterのインタフェースを作成し、プロファイルを使用してキャッシュの読み書きを切り替えることができます.たとえば、キャッシュの読み書きもhttpruntime.cacheで行うことができます.
コードは次のとおりです.
1 public interface ICacheWriter
2 {
3         void Set(string key, object value, DateTime exp);
4         void Set(string key, object value);
5         object Get(string key);
6 }

プロファイル内のappSettingsノードの下にmemcachedサーバアドレスを追加します.例:
<add key="memcachedServer" value="127.0.0.1:11211" />

新しいMemcachedWriterクラスを作成します.コードは次のとおりです.
 1         //    
 2         private static readonly MemcachedClient client;
 3         static MemcachedWriter()
 4         {           
 5 
 6             string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
 7 
 8             //   socket 
 9             SockIOPool pool = SockIOPool.GetInstance();
10             pool.SetServers(servers);
11             pool.InitConnections = 1;
12             pool.MinConnections = 1;
13             pool.MaxConnections = 3;
14             pool.SocketConnectTimeout = 1000;//socket    ,         socket
15             pool.SocketTimeout = 3000;
16             pool.MaintenanceSleep = 30;//        
17             pool.Failover = true;//    (        )    
18             pool.Nagle = false;//   nagle    socket 
19             pool.Initialize();//        socket 
20 
21             //  memcached   
22             client = new MemcachedClient();
23             client.EnableCompression = false;//      
24 
25         }
26         public void Set(string key, object value, DateTime exp)
27         {
28             client.Set(key, value, exp);
29         }
30 
31         public void Set(string key, object value)
32         {
33             client.Set(key, value);
34         }
35 
36         public object Get(string key)
37         {
38             return client.Get(key);
39         }        

これにより、構成によってサーバを追加および変更できます.
インタフェースクラスとインプリメンテーションクラスがあれば、Spring.Netを利用して工場を実現します.
新しいCacheHelperクラスを作成します.コードは次のとおりです.
 1    public class CacheHelper
 2     {
 3         public static ICacheWriter CacheWriter { get; set; }
 4 
 5         static CacheHelper() 
 6         { 
 7             //        ,        ,           ,    
 8             //         ,   Spring      ,    CacheWriter      
 9             //             Spring              ,        ,           
10 
11             IApplicationContext ctx = ContextRegistry.GetContext();
12             ctx.GetObject("CacheHelper");
13 
14         }
15         public static void WriteCache(string key,object value,DateTime exp)
16         {
17             CacheWriter.Set(key, value, exp);
18         }
19         public static void WriteCache(string key, object value)
20         {
21             CacheWriter.Set(key, value);
22         }
23 
24         public static object GetCache(string key)
25         {
26             return CacheWriter.Get(key);
27         }
28     }
public static ICacheWriter CacheWriter { get; set; }

この属性がSpring.Netの注入ポイントです.
Spring.Netはクラスに最初のインスタンスがある場合にのみ注入されるため、静的メソッド内では静的フィールドのみが呼び出されます.静的メソッドと静的フィールドはプログラムの実行開始時に作成され、CacheHelperには最初のインスタンスがないため、静的フィールドCacheWriterは注入されず、CacheHelperを手動でインスタンス化する必要があります.CacheWriterを注入させます.
プロファイルのSpringノードにCacheHelperとCacheWriterの構成情報を追加します.
1 <objects xmlns="http://www.springframework.net">
2   <!--CacheHelper  CacheWriter   ,CacheWriter    -->
3   <object name="CacheHelper" type="MyOA_Common.CacheHelper, MyOA_Common"  singleton="false">
4     <property name="CacheWriter" ref="MemcachedWriter" />
5   </object>
6   <object name="MemcachedWriter" type="MyOA_Common.MemcachedWriter, MyOA_Common"  singleton="true">
7     
8   </object>
9 </objects>

httpruntime.cachedでキャッシュ読み書きをしたくない場合は、変更するだけです.
<object name="MemcachedWriter" type="MyOA_Common.MemcachedWriter, MyOA_Common"  singleton="true">

Spring.Net 。

, :
 1     public class TestController : Controller
 2     {
 3         // GET: /Test/
 4         public ActionResult Test()
 5         {
 6             CacheHelper.CacheWriter.Set("test", "    ");
 7             return View();
 8         }
 9 
10         [HttpPost]
11         public ActionResult Test(FormCollection form)
12         {
13             string value = (string)CacheHelper.CacheWriter.Get("test");
14             return Content(value);
15         }
16 
17     }

Webページに「テストに成功しました」と表示されます.つまり、分散キャッシュが完了しました.
本文の目的は各位の園友と交流して経験を分かち合うことで、もしあなたが本文の中で何か間違いがあることを発見してあるいはあなたが何かもっと良い提案があるならば、あなたが提出することを歓迎します!本文に記載されているものについて知らないところがあれば、私の他のブログに返信したり、確認したりすることができます.