1 Обзор
Обычно, когда мы запускаем программу, генерируются некоторые промежуточные данные, и эти промежуточные данные необходимо прочитать в какой-то момент в будущем. Это требует от нас хранить его в месте, обеспечивающем высокоскоростной доступ. Лучший выбор — в памяти. По этой и многим другим причинам нам необходимо хранить эту часть на других машинах, что создает проблему распределенного кэша.
Фактически, распределенный кеш по сути предоставляет дополнительную память другой машине для хранения и поиска данных.
2 метода реализации
Сначала создайте объект коллекции, который должен быть потокобезопасным. Код выглядит следующим образом
Код
1 общедоступный статический класс MemObject
2 {
3 статический MemObject()
4 {
5 MemObjl = новый словарь<строка, объект>();
6}
7
8 общедоступный статический словарь<строка, объект> Get()
9 {
10, если (MemObjl == ноль)
11 MemObjl = новый словарь<строка, объект>();
12 вернуть MemObjl;
13}
14
15 public static void Add(строковый ключ, объект obj)
16 {
17 Словарь<строка, объект> obg = Get();
18 if (!obg.ContainsKey(ключ))
19 obg.Add(ключ, объект);
20}
двадцать один
22 public static void Remove (строковый ключ)
двадцать три {
24 Get().Remove(ключ);
25}
26
27 public static int Count()
28 {
29 возврат Get().Count;
30}
31
32 общедоступный статический объект Get (строковый ключ)
33 {
34 Словарь<строка, объект> obg = Get();
35 если (obg.ContainsKey(ключ))
36 возврат obg[ключ];
37 возвращает ноль;
38 }
39
40 public static bool Выходы (строковый ключ)
41 {
42 return Get().ContainsKey(ключ);
43}
44
45 частный статический словарь<строка, объект> MemObjl;
46 }
Затем мы его заворачиваем и вызываем удаленно. Код следующий.
Код
1 общедоступный класс DataCatcher: MarshalByRefObject, ICarrier.ICarrier
2 {
3 public void Set (строковый ключ, значение объекта)
4 {
5 //если (Выход(ключ))
6 // Удалить (ключ);
7 //MemObjl.Add(ключ, значение);
8 MemObject.Add(ключ, значение);
9}
10
11 общедоступных логических выходов (строковый ключ)
12 {
13 вернуть MemObject.Exits(ключ);
14}
15
16 public void Remove (строковый ключ)
17 {
18 MemObject.Remove(ключ);
19}
20
21 публичный int Count()
двадцать два {
23 вернуть MemObject.Count();
двадцать четыре }
25
26 общедоступный объект Get (строковый ключ)
27 {
28 вернуть MemObject.Get(ключ);
29 }
30}
Во избежание утечки нашей бизнес-логики мы предоставляем клиенту интерфейс для вызова
Код
1 общедоступный интерфейс ICarrier
2 {
3
4 void Remove (строковый ключ);
5
6 bool Выходы (строковый ключ);
7
8 void Set (строковый ключ, значение объекта);
9
10 объектов Получить (строковый ключ);
11
12 число число();
13}
хорошо. Таким образом, наш серверный код завершен.
Далее мы публикуем услугу для звонков клиентов
Код
1 общедоступный частичный класс SharpCatchedService: ServiceBase
2 {
3 публичный SharpCatchedService()
4 {
5 ИнициализироватьКомпонент();
6}
7
8 защищенное переопределение void OnStart(string[] args)
9 {
10 Канал TcpChannel = новый TcpChannel(ConfigHelper.Port);
11 ChannelServices.RegisterChannel(канал, ложь);
12 RemotingConfiguration.RegisterWellKnownServiceType(typeof(DataCatcher),
13 "SharpCatched", WellKnownObjectMode.Singleton);
14}
15
16 защищенное переопределение void OnStop()
17 {
18}
19}
Таким образом, клиент может получить доступ к удаленным данным через этот интерфейс.
На стороне клиента сначала мы получаем удаленный объект
Код
общедоступный статический ICarrier Carrier()
{
Оператор ICarrier = (ICarrier)Activator.GetObject(typeof(ICarrier), "tcp://localhost:" + ConfigHelper.Port + "/SharpCatched");
возврат перевозчика;
}
Затем мы упаковываем его
Код
1 общедоступный класс SharpCatchedAPI
2 {
3 iCarrier iCarrier;
4
5 публичная пустота 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 (строковый ключ)
двадцать один {
22 возврат icarrier.Get(ключ);
двадцать три }
двадцать четыре
25 общедоступных логических выходов (строковый ключ)
26 {
27 return icarrier.Exits(ключ);
28 }
29 }
3 продолжения
Вышеупомянутая реализация является самым простым решением распределенного кэша. Фактически, мы можем преобразовать эту коллекцию в другие объекты коллекции, например HashTable. Поток демона запускается при запуске объекта. Задача этого процесса — добавить объект кэша с истекшим сроком действия к объекту коллекции, а затем пройти по объекту для уничтожения объекта кэша. Мы также можем один раз хешировать объект и сохранить его на нескольких серверах кэширования.