1 ภาพรวม
โดยปกติเมื่อเรารันโปรแกรม ข้อมูลระดับกลางบางส่วนจะถูกสร้างขึ้น และข้อมูลระดับกลางเหล่านี้จำเป็นต้องอ่านในอนาคต สิ่งนี้ต้องการให้เราเก็บไว้ในที่ที่ให้การเข้าถึงความเร็วสูง ทางเลือกที่ดีที่สุดคือในหน่วยความจำ ด้วยเหตุนี้และเหตุผลหลายประการ เราจึงต้องจัดเก็บส่วนนี้ไว้ในเครื่องอื่น ซึ่งจะทำให้เกิดปัญหาแคชแบบกระจาย
โดยทั่วไปแล้ว แคชแบบกระจายจะมอบหน่วยความจำเพิ่มเติมให้กับเครื่องอื่นเพื่อช่วยจัดเก็บและค้นหาข้อมูล
2 วิธีการนำไปปฏิบัติ
ขั้นแรกให้สร้างอ็อบเจ็กต์การรวบรวม ซึ่งควรจะปลอดภัยต่อเธรด รหัสมีดังนี้
รหัส
MemObject คลาสคงที่สาธารณะ 1 รายการ
2 {
3 MemObject แบบคงที่ ()
4 {
5 MemObjl = พจนานุกรมใหม่<string, object>();
6}
7
8 พจนานุกรมสาธารณะคงที่ <string, object> Get()
9 {
10 ถ้า (MemObjl == null)
11 MemObjl = พจนานุกรมใหม่<string, object>();
12 กลับ MemObjl;
13}
14
15 โมฆะสาธารณะคงที่เพิ่ม (คีย์สตริงวัตถุ obj)
16 {
17 พจนานุกรม<string, object> obg = Get();
18 ถ้า (!obg.ContainsKey(คีย์))
19 obg.เพิ่ม (คีย์ obj);
20}
ยี่สิบเอ็ด
22 ลบโมฆะคงที่สาธารณะ (คีย์สตริง)
ยี่สิบสาม {
24 รับ().ลบ(คีย์);
25}
26
27 int สาธารณะคงที่นับ ()
28 {
29 กลับรับ().นับ;
30}
31
32 วัตถุคงที่สาธารณะรับ (คีย์สตริง)
33 {
34 พจนานุกรม<string, object> obg = Get();
35 ถ้า (obg.ContainsKey (คีย์))
36 กลับ obg [คีย์];
37 กลับเป็นโมฆะ;
38 }
39
40 ออกบูลคงที่สาธารณะ (คีย์สตริง)
41 {
42 กลับรับ ().ContainsKey (คีย์);
43}
44
45 พจนานุกรมคงที่ส่วนตัว <string, object> MemObjl;
46 }
จากนั้นเราก็สรุปและเรียกมันจากระยะไกลรหัสมีดังนี้
รหัส
1 DataCatcher คลาสสาธารณะ: MarshalByRefObject, ICarrier.ICarrier
2 {
3 ชุดโมฆะสาธารณะ (คีย์สตริง, ค่าวัตถุ)
4 {
5 // ถ้า (ออก (คีย์))
6 // ลบ(คีย์);
7 //MemObjl.Add(คีย์, ค่า);
8 MemObject.Add (คีย์, ค่า);
9}
10
11 ทางออกของบูลสาธารณะ (คีย์สตริง)
12 {
13 ส่งคืน MemObject.Exits (คีย์);
14}
15
16 โมฆะสาธารณะ ลบ (คีย์สตริง)
17 {
18 MemObject.Remove (คีย์);
19}
20
21 สาธารณะ int นับ()
ยี่สิบสอง {
23 กลับ MemObject.Count();
ยี่สิบสี่ }
25
26 วัตถุสาธารณะรับ (คีย์สตริง)
27 {
28 ส่งคืน MemObject.Get (คีย์);
29 }
30}
เพื่อหลีกเลี่ยงการรั่วไหลของตรรกะทางธุรกิจของเรา เราได้จัดเตรียมอินเทอร์เฟซให้กับลูกค้าสำหรับการโทร
รหัส
1 อินเทอร์เฟซสาธารณะ ICarrier
2 {
3
4 โมฆะ ลบ (คีย์สตริง);
5
6 บูลออก (คีย์สตริง);
7
8 ชุดโมฆะ (คีย์สตริง, ค่าวัตถุ);
9
10 วัตถุรับ (คีย์สตริง);
11
12 จำนวน int();
13}
ใช้ได้. ด้วยวิธีนี้ รหัสฝั่งเซิร์ฟเวอร์ของเราจึงเสร็จสมบูรณ์
ต่อไปเราจะเผยแพร่บริการเพื่อให้ลูกค้าโทร
รหัส
1 SharpCatchedService คลาสสาธารณะบางส่วน: ServiceBase
2 {
3 SharpCatchedService สาธารณะ ()
4 {
5 เตรียมใช้งานส่วนประกอบ();
6}
7
8 การแทนที่การป้องกันเป็นโมฆะ OnStart (สตริง [] args)
9 {
10 ช่อง TcpChannel = TcpChannel ใหม่ (ConfigHelper.Port);
11 ChannelServices.RegisterChannel (ช่อง, เท็จ);
12 RemotingConfiguration.RegisterWellKnownServiceType (ประเภทของ (DataCatcher)
13 "SharpCatched", WellKnownObjectMode.ซิงเกิลตัน);
14}
15
16 การป้องกันแทนที่เป็นโมฆะ OnStop ()
17 {
18}
19}
ด้วยวิธีนี้ ลูกค้าสามารถเข้าถึงข้อมูลระยะไกลผ่านอินเทอร์เฟซนี้ได้
ในฝั่งไคลเอ็นต์ ก่อนอื่นเราจะได้รับวัตถุระยะไกล
รหัส
ผู้ให้บริการ ICarrier แบบคงที่สาธารณะ ()
-
ผู้ให้บริการ ICarrier = (ICarrier) Activator.GetObject (ประเภทของ (ICarrier), "tcp://localhost:" + ConfigHelper.Port + "/SharpCatched");
ผู้ให้บริการส่งคืน;
-
จากนั้นเราก็แพ็คมัน
รหัส
SharpCatchedAPI คลาสสาธารณะ 1 รายการ
2 {
3 ไอแคร์ริเออร์ ไอแคร์ริเออร์;
4
5 โมฆะสาธารณะ Init()
6 {
7 icarrier = DoConnect.Carrier();
8}
9
ชุดโมฆะสาธารณะ 10 ชุด (คีย์สตริง, ค่าวัตถุ)
11 {
12icarrier.Set(คีย์, ค่า);
13}
14
15 โมฆะสาธารณะ ลบ (คีย์สตริง)
16 {
17 icarrier.Remove (คีย์);
18}
19
รับวัตถุสาธารณะ 20 รายการ (คีย์สตริง)
ยี่สิบเอ็ด {
22 ส่งคืน icarrier.Get (คีย์);
ยี่สิบสาม }
ยี่สิบสี่
25 ทางออกสาธารณะ (คีย์สตริง)
26 {
27 กลับ icarrier.Exits (คีย์);
28 }
29 }
3 การติดตามผล
การใช้งานข้างต้นเป็นโซลูชันแคชแบบกระจายขั้นพื้นฐานที่สุด ที่จริงแล้ว เราสามารถแปลงคอลเลกชันนี้เป็นวัตถุคอลเลกชันอื่นๆ ได้ เช่น HashTable เธรด daemon เริ่มต้นขึ้นเมื่อวัตถุเริ่มทำงาน งานของกระบวนการนี้คือการผนวกวัตถุแคชที่หมดอายุเข้ากับวัตถุคอลเลกชัน จากนั้นสำรวจวัตถุเพื่อทำลายวัตถุแคช นอกจากนี้เรายังสามารถแฮชอ็อบเจ็กต์ได้เพียงครั้งเดียวและจัดเก็บออบเจ็กต์ไว้ในเซิร์ฟเวอร์แคชหลายเครื่อง