Производительность поиска в кэше - PullRequest
4 голосов
/ 14 апреля 2009

У нас есть большое приложение Winforms C #, которое в основном является интерфейсом для некоторых баз данных (CRUD), и я пытаюсь реализовать его в кеше памяти для бизнес-объектов.

Что-то вроде:

List<Customer> customerCache; // Loaded during app. startup

Я уже создал некоторый код, чтобы поддерживать кэш в актуальном состоянии с базой данных. Этот код все время выполняется в отдельном потоке и работает очень хорошо. Моя проблема заключается в том, что в зависимости от размера кэша, быстрее сделать 'select * from customer, где id = x' в базе данных, чем циклически проходить через кэш с помощью foreach (foreach Customer cmr в customerCache), чтобы найти этот конкретный объект ...

Есть ли способ быстрого поиска определенных объектов в моем кеше? Я собирался попробовать какой-нибудь алгоритм или изменить тип своей коллекции, но я был бы признателен выслушать ваши предложения.

Обратите внимание, что у нас есть несколько «List xxxCache», и все быстро (для маленького N, конечно). Но когда число кэшируемых itens увеличивается (> 3000 обычно), его быстрее считывать из базы данных.

Какой лучший способ перебрать мои кэшированные элементы, чтобы найти конкретный? Все бизнес-элементы наследуются от общего предка и имеют свойство ID (целое, уникальное).

Извините за мой плохой английский, это не мой основной язык. С наилучшими пожеланиями, Привет из Бразилии.

Ответы [ 4 ]

6 голосов
/ 14 апреля 2009

Используйте Dictionary<int, Customer> вместо. Он поддерживает поиск O (1) на основе ключа. В этом случае ключом будет Customer.Id.

Возможно, вы захотите взглянуть и на другие готовые решения для кэширования базы данных для .Net.

0 голосов
/ 16 апреля 2009

У нас есть аналогичный случай для приложения веб-формы. Мы используем блок MS Enterprise Lib Cache. Это легко реализовать и использовать. Единственное, что вам нужно сосредоточиться в Cache Key (строковый тип) cache.add (ключ, объект) cache.getdata (ключ)

0 голосов
/ 14 апреля 2009

используйте столько словарей, сколько вам нужно индексов.

dictionary<int,Customer> CustomerIds //(Ids)  
dictionary<string,Customer> CustomerNames //(Names)  
//or  
dictionary<string,List<Customer>> //(if name is not unique)
0 голосов
/ 14 апреля 2009

Использование объекта List <T>, почему бы не использовать:

KeyValuePair

Словарь - это правильный объект для использования (KeyValuePair - это то, что словарь содержит коллекцию **facepalm**)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...