1 概要
通常、プログラムを実行すると、いくつかの中間データが生成され、将来のある時点でこれらの中間データを読み取る必要があります。そのため、高速アクセスを提供する場所に保存する必要があります。最適な選択はメモリです。このような理由から、この部分を他のマシンに保存する必要があり、分散キャッシュの問題が発生します。
実際、分散キャッシュは基本的に、データの保存と検索を支援するために別のマシンに追加のメモリを提供します。
2 実施方法
まず、スレッドセーフである必要があるコレクション オブジェクトを作成します。コードは次のとおりです
コード
1 つのパブリック静的クラス MemObject
2 {
3 静的 MemObject()
4 {
5 MemObjl = new Dictionary<string, object>();
6}
7
8 public static Dictionary<string, object> Get()
9 {
10 if (MemObjl == null)
11 MemObjl = new Dictionary<文字列, オブジェクト>();
12 MemObjl を返します。
13}
14
15 public static void Add(文字列キー, オブジェクトオブジェクト)
16 {
17 Dictionary<文字列, オブジェクト> obg = Get();
18 if (!obg.ContainsKey(key))
19 obg.Add(key, obj);
20}
21
22 public static void Remove(文字列キー)
23 {
24 Get().Remove(キー);
25}
26
27 パブリック静的 int Count()
28 {
29 リターン Get().Count;
30}
31
32 パブリック静的オブジェクト Get(文字列キー)
33 {
34 辞書<文字列, オブジェクト> obg = Get();
35 if (obg.ContainsKey(key))
36 return obg[キー];
37 null を返します。
38 }
39
40 public static bool Exits(文字列キー)
41 {
42 return Get().ContainsKey(key);
43}
44
45 private static Dictionary<string, object> MemObjl;
46 }
次に、それをラップしてリモートで呼び出します。コードは次のとおりです。
コード
1 パブリック クラス DataCatcher : MarshalByRefObject、ICarrier.ICarrier
2 {
3 public void Set(文字列キー, オブジェクト値)
4 {
5 //if (終了(キー))
6 // 削除(キー);
7 //MemObjl.Add(キー, 値);
8 MemObject.Add(キー, 値);
9}
10
11 個の public bool Exits(文字列キー)
12 {
13 return MemObject.Exits(key);
14}
15
16 public void Remove(文字列キー)
17 {
18 MemObject.Remove(キー);
19}
20
21 パブリック int Count()
22 {
23 return MemObject.Count();
24 }
25
26 パブリックオブジェクト Get(文字列キー)
27 {
28 return MemObject.Get(key);
29 }
30}
ビジネスロジックの漏洩を避けるために、クライアントに呼び出し用のインターフェースを提供します。
コード
1 つのパブリック インターフェイス ICarrier
2 {
3
4 void Remove(文字列キー);
5
6 bool Exits(文字列キー);
7
8 void Set(文字列キー,オブジェクト値);
9
10 オブジェクト Get(文字列キー);
11
12 int Count();
13}
大丈夫。このようにして、サーバー側のコードが完成します。
次に、クライアントが呼び出すサービスを公開します。
コード
1 つのパブリック部分クラス SharpCatchedService : ServiceBase
2 {
3 パブリック SharpCatchedService()
4 {
5 InitializeComponent();
6}
7
8 保護されたオーバーライド void OnStart(string[] args)
9 {
10 TcpChannel チャネル = 新しい TcpChannel(ConfigHelper.Port);
11 ChannelServices.RegisterChannel(channel, false);
12 RemotingConfiguration.RegisterWellKnownServiceType(typeof(DataCatcher),
13 "SharpCatched"、WellKnownObjectMode.Singleton);
14}
15
16 保護されたオーバーライド void OnStop()
17 {
18}
19}
このようにして、クライアントはこのインターフェイスを通じてリモート データにアクセスできます。
クライアント側では、まずリモート オブジェクトを取得します。
コード
public static ICarrier Carrier()
{
ICarrier キャリア = (ICarrier)Activator.GetObject(typeof(ICarrier), "tcp://localhost:" + ConfigHelper.Port + "/SharpCatched");
返送運送業者。
}
それから梱包していきます
コード
1 パブリック クラス SharpCatchedAPI
2 {
3 Iキャリア iキャリア;
4
5 パブリック void Init()
6 {
7 icarrier = DoConnect.Carrier();
8}
9
10 public void Set(文字列キー, オブジェクト値)
11 {
12icarrier.Set(キー, 値);
13}
14
15 public void Remove(文字列キー)
16 {
17 icarrier.Remove(キー);
18}
19
20 パブリックオブジェクト Get(文字列キー)
21 {
22 return icarrier.Get(key);
23 }
24
25 public bool Exits(文字列キー)
26 {
27 return icarrier.Exits(key);
28 }
29 }
3 フォローアップ
上記の実装は、最も基本的な分散キャッシュ ソリューションです。実際、このコレクションを HashTable などの他のコレクション オブジェクトに変換できます。オブジェクトの開始時にデーモン スレッドが開始され、このプロセスの役割は、期限切れのキャッシュ オブジェクトをコレクション オブジェクトに追加し、オブジェクトを走査してキャッシュ オブジェクトを破棄することです。オブジェクトを一度ハッシュして、複数のキャッシュ サーバーに保存することもできます。