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<string, object>();
12 MemObjl을 반환합니다.
13}
14
15 public static void Add(문자열 키, 객체 obj)
16 {
17 Dictionary<string, object> obg = Get();
18 if (!obg.ContainsKey(key))
19 obg.Add(키, obj);
20}
스물하나
22 public static void 제거(문자열 키)
스물셋 {
24 Get().제거(키);
25}
26
27 공개 정적 정수 개수()
28 {
29 return Get().Count;
30}
31
32 공개 정적 객체 Get(문자열 키)
33 {
34 Dictionary<string, object> obg = Get();
35 if (obg.ContainsKey(key))
36 반환 obg[키];
37 null을 반환합니다.
38 }
39
40개의 public static boole 종료(문자열 키)
41 {
42 return Get().ContainsKey(key);
43}
44
45 개인 정적 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 boole 종료(문자열 키)
12 {
13 return MemObject.Exits(key);
14}
15
16 public void 제거(문자열 키)
17 {
18 MemObject.Remove(키);
19}
20
21 공개 정수 개수()
스물 둘 {
23 return MemObject.Count();
스물넷 }
25
26 공개 객체 Get(문자열 키)
27 {
28 return MemObject.Get(key);
29 }
30}
비즈니스 로직의 유출을 방지하기 위해 클라이언트에 호출을 위한 인터페이스를 제공합니다.
암호
공용 인터페이스 ICarrier 1개
2 {
3
4 void Remove(문자열 키);
5
6 bool 종료(문자열 키);
7
8 void Set(문자열 키, 객체 값);
9
10 개체 Get(문자열 키);
11
12 정수 개수();
13}
괜찮은. 이렇게 해서 서버측 코드가 완성되었습니다.
다음으로 고객이 전화할 수 있는 서비스를 게시합니다.
암호
1개의 공개 부분 클래스 SharpCatchedService: ServiceBase
2 {
3 공개 SharpCatchedService()
4 {
5 초기화구성요소();
6}
7
8 보호된 재정의 void OnStart(string[] args)
9 {
10 TcpChannel 채널 = new TcpChannel(ConfigHelper.Port);
11 ChannelServices.RegisterChannel(채널, false);
12 RemotingConfiguration.RegisterWellKnownServiceType(typeof(DataCatcher),
13 "SharpCatched", WellKnownObjectMode.Singleton);
14}
15
16 보호된 재정의 무효 OnStop()
17 {
18}
19}
이러한 방식으로 클라이언트는 이 인터페이스를 통해 원격 데이터에 액세스할 수 있습니다.
클라이언트 측에서는 먼저 원격 객체를 얻습니다.
암호
공개 정적 ICCarrier 캐리어()
{
ICarrier Carrier = (ICarrier)Activator.GetObject(typeof(ICarrier), "tcp://localhost:" + ConfigHelper.Port + "/SharpCatched");
반송업체;
}
그럼 포장해보겠습니다
암호
1개의 공개 클래스 SharpCatchedAPI
2 {
3 IC캐리어 iCarrier;
4
5 공개 무효 Init()
6 {
7 IC캐리어 = DoConnect.Carrier();
8}
9
10 public void Set(문자열 키, 객체 값)
11 {
12carrier.Set(키, 값);
13}
14
15 public void 제거(문자열 키)
16 {
17 icarrier.Remove(키);
18}
19
20 공개 객체 Get(문자열 키)
스물 하나 {
22 iccarrier.Get(키)를 반환합니다.
스물셋 }
스물넷
25 public boole 종료(문자열 키)
26 {
27 iccarrier.Exits(key)를 반환합니다.
28 }
29 }
3 후속 조치
위의 구현은 가장 기본적인 분산 캐시 솔루션입니다. 실제로 이 컬렉션을 HashTable과 같은 다른 컬렉션 개체로 변환할 수 있습니다. 개체가 시작되면 데몬 스레드가 시작됩니다. 이 프로세스의 작업은 만료된 캐시 개체를 컬렉션 개체에 추가한 다음 개체를 탐색하여 캐시 개체를 삭제하는 것입니다. 또한 개체를 한 번 해시하고 여러 캐시 서버에 개체를 저장할 수도 있습니다.