1 Ikhtisar
Biasanya ketika kita menjalankan program, beberapa data perantara akan dihasilkan, dan data perantara ini perlu dibaca suatu saat nanti. Hal ini mengharuskan kita menyimpannya di tempat yang menyediakan akses berkecepatan tinggi. Pilihan terbaik ada di memori. Karena alasan ini dan banyak alasan lainnya, kita perlu menyimpan bagian ini di mesin lain, yang menimbulkan masalah cache terdistribusi.
Faktanya, cache terdistribusi pada dasarnya menyediakan memori tambahan untuk mesin lain guna membantu menyimpan dan menemukan data.
2 Metode pelaksanaan
Pertama buat objek koleksi, yang harus aman untuk thread. Kodenya adalah sebagai berikut
Kode
1 MemObject kelas statis publik
2 {
3 MemObject statis()
4 {
5 MemObjl = Kamus baru<string, objek>();
6}
7
8 Kamus statis publik<string, objek> Dapatkan()
9 {
10 jika (MemObjl == nol)
11 MemObjl = Kamus baru<string, objek>();
12 kembalikan MemObjl;
13}
14
15 public static void Add (kunci string, objek objek)
16 {
17 Kamus<string, objek> obg = Dapatkan();
18 jika (!obg.ContainsKey(kunci))
19 obg.Tambahkan(kunci, obj);
20}
dua puluh satu
22 kekosongan statis publik Hapus (kunci string)
dua puluh tiga {
24 Dapatkan().Hapus(kunci);
25}
26
27 Hitungan int statis publik()
28 {
29 kembalikan Dapatkan().Hitungan;
30}
31
32 Dapatkan objek statis publik (kunci string)
33 {
34 Kamus<string, objek> obg = Dapatkan();
35 jika (obg.ContainsKey(kunci))
36 kembalikan obg[kunci];
37 mengembalikan nol;
38 }
39
40 bool statis publik Keluar (kunci string)
41 {
42 kembalikan Get().ContainsKey(kunci);
43}
44
45 Kamus statis pribadi<string, objek> MemObjl;
46 }
Kemudian kita bungkus dan panggil dari jarak jauh Kodenya adalah sebagai berikut
Kode
1 DataCatcher kelas publik : MarshalByRefObject, ICarrier.ICarrier
2 {
3 Set kekosongan publik (kunci string, nilai objek)
4 {
5 //jika (Keluar(kunci))
6 // Hapus(kunci);
7 //MemObjl.Tambahkan(kunci, nilai);
8 MemObject.Add(kunci, nilai);
9}
10
11 bool publik Keluar (kunci string)
12 {
13 return MemObject.Exits(kunci);
14}
15
16 kekosongan publik Hapus (kunci string)
17 {
18 MemObject.Hapus(kunci);
19}
20
21 Hitungan int publik()
dua puluh dua {
23 kembalikan MemObject.Count();
dua puluh empat }
25
26 objek publik Dapatkan (kunci string)
27 {
28 kembalikan MemObject.Get(kunci);
29 }
30}
Untuk menghindari kebocoran logika bisnis kami, kami menyediakan antarmuka ke klien untuk panggilan
Kode
1 antarmuka publik ICarrier
2 {
3
4 batal Hapus (kunci string);
5
6 bool Keluar (kunci string);
7
8 void Set (kunci string, nilai objek);
9
10 objek Dapatkan (kunci string);
11
12 int Hitung();
13}
Baiklah. Dengan cara ini, kode sisi server kami selesai.
Selanjutnya kami menerbitkan layanan untuk dihubungi klien
Kode
1 kelas parsial publik SharpCatchedService : ServiceBase
2 {
3 SharpCatchedService publik()
4 {
5 Inisialisasi Komponen();
6}
7
8 penggantian yang dilindungi void OnStart(string[] args)
9 {
10 Saluran TcpChannel = TcpChannel baru(ConfigHelper.Port);
11 ChannelServices.RegisterChannel(saluran, salah);
12 RemotingConfiguration.RegisterWellKnownServiceType(typeof(DataCatcher),
13 "SharpCatched", WellKnownObjectMode.Singleton);
14}
15
16 penggantian yang dilindungi void OnStop()
17 {
18}
19}
Dengan cara ini, klien dapat mengakses data jarak jauh melalui antarmuka ini.
Di sisi klien, pertama-tama kita mendapatkan objek jarak jauh
Kode
Pembawa ICarrier statis publik()
{
ICarrier operator = (ICarrier)Activator.GetObject(typeof(ICarrier), "tcp://localhost:" + ConfigHelper.Port + "/SharpCatched");
pembawa kembali;
}
Lalu kami mengemasnya
Kode
1 SharpCatchedAPI kelas publik
2 {
3 iCarrier iCarrier;
4
5 Init kekosongan publik()
6 {
7 icarrier = DoConnect.Carrier();
8}
9
10 public void Set (kunci string, nilai objek)
11 {
12icarrier.Set(kunci, nilai);
13}
14
15 kekosongan publik Hapus (kunci string)
16 {
17 icarrier.Hapus(kunci);
18}
19
20 objek publik Dapatkan (kunci string)
dua puluh satu {
22 kembalikan icarrier.Dapatkan(kunci);
dua puluh tiga }
dua puluh empat
25 bool publik Keluar (kunci string)
26 {
27 kembalikan icarrier.Keluar(kunci);
28 }
29 }
3 tindak lanjut
Implementasi di atas adalah solusi cache terdistribusi paling dasar. Bahkan, kita bisa mengubah koleksi ini menjadi objek koleksi lainnya, seperti HashTable. Thread daemon dimulai ketika objek dimulai. Tugas dari proses ini adalah menambahkan objek cache yang sudah kadaluwarsa ke objek koleksi, dan kemudian melintasi objek tersebut untuk menghancurkan objek cache. Kita juga dapat melakukan hashing pada objek satu kali dan menyimpan objek tersebut di beberapa server cache.