Хранение постоянных данных в памяти - PullRequest
7 голосов
/ 16 сентября 2010

Я собираюсь разработать службу Windows на C #.Эта служба должна отслеживать события в системе и время от времени записывать некоторые данные в файлы.Эти текущие события формируют определенное состояние, поэтому я буду хранить это состояние в памяти и обновлять его по мере поступления событий.Я не хочу чрезмерно усложнять вещи, поэтому я не хочу, чтобы состояние было постоянным на диске, но мне интересно, смогу ли я как-то сделать его постоянным в памяти, чтобы в случае сбоя службы (и автозапускаWindows) он может забрать с того места, где он ушел, и продолжать (возможно, потерять некоторые события, а это не имеет большого значения).

Я думал о том, чтобы создать «разделяемую» область памяти, чтобы позволить Windows управлять ею и использовать ее только в службе - но я не уверен, что объект сохранится после смерти службы.

Есть идеи?

РЕДАКТИРОВАТЬ : Я не ищу решения по излишнему количеству.Данные несколько важны, поэтому я хотел бы подождать их в памяти, пока служба не будет перезапущена, но данные не являются слишком важными.Это более приятная функция, если я могу легко сохранять данные, не работая с файлами, внешними процессами сторонних производителей и так далее.Моим идеальным решением была бы простая встроенная функция (в .NET или в Windows), которая обеспечит мне некоторую постоянную память, просто для восстановления после сбоя.

Ответы [ 6 ]

3 голосов
/ 16 сентября 2010

Я знаю, что вы сказали, что вы не хотите чрезмерно усложнять вещи, сохраняя их на диске, но это определенно будет намного сложнее сохранять вещи в общей памяти или любом из перечисленных здесь решений. Причина, по которой так много приложений используют базы данных или хранилище файлов, заключается в том, что это самое простое решение.

Я бы порекомендовал вам сохранить все состояния в одном объекте или иерархии объектов, сериализовать этот объект в XML и записать его в файл. Это действительно не становится намного проще, чем это.

3 голосов
/ 16 сентября 2010

Блок постоянного кэширования можно использовать из Microsoft Enterprise Library .

Это настраивается, и вы можете использовать множество резервных хранилищ, таких как базы данных и изолированное хранилище.

2 голосов
/ 16 сентября 2010

Вы можете использовать Memcached или Redis (который также сохраняет данные на диске, но обрабатывает их автоматически).

http://code.google.com/p/redis/

Вы также можете взглянуть на этот вопрос:

Memcached с Windows и .NET

1 голос
/ 16 сентября 2010

Я не понимаю, почему было бы труднее сохранить на диск.

используя db4o вы можете сохранить экземпляры, с которыми вы уже работаете.

0 голосов
/ 16 сентября 2010

Даже если, например, вы храните данные в общей памяти какого-либо другого сетевого ПК , как бы вы «гарантировали», что сетевой ПК не будет зависать / перезапускаться / остановка / и т.д.? В этом случае ваш сервис все равно потеряет сохраненные данные.

Я бы предложил, и есть вероятность, что вы в конечном итоге будете хранить данные на одном диске.

Обратите внимание, что из-за изменчивой природы памяти (RAM) вы не можете перезагрузить данные, которые были там ранее, до перезагрузки системы; нет, если вы не используете какой-либо механизм для хранения / перезагрузки на диске.

- EDIT -

В таком случае, как насчет использования MSMQ ? Таким образом, вы можете перенести все в очередь, и даже если ваша служба перезапустится, она будет искать элементы в очереди и продолжать работу.

0 голосов
/ 16 сентября 2010

Как насчет использования изолированного хранилища и сохранения объекта в памяти таким образом?

...