2015-05-05 3 views
0

В настоящее время я учу себя некоторым F # и делаю так, работая над (немым) приложением, которое читает и обновляет клиентов, которые хранятся в базе данных. Каждый клиент имеет свойство «тип клиента», которое хранится в отдельной таблице в базе данных. Поскольку список типов клиентов практически постоянный, я хочу кэшировать запрос базы данных, который извлекает эти типы клиентов, например.F # обновление кэшированного списка

let getCustomerTypes = 
    let allTypes = SomeDbFunction |> Seq.map SomeMappingFunction 
    Seq.cache allTypes 

Теперь я stubled на проблему, что, когда я ввожу новый тип клиента (опять же, это происходит скажем, раз в месяц), вызов getCustomerTypes не отражает недавно вставленный тип клиента. Чтобы решить эту проблему, я просмотрел memoization, например. http://blogs.msdn.com/b/dsyme/archive/2007/05/31/a-sample-of-the-memoization-pattern-in-f.aspx. Однако целью memoization является возвращение значения, если оно ранее было рассчитано, но это не соответствует моему сценарию.

Что такое рекомендуемый функциональный/F # способ обновления кеша?

+2

Честно говоря, я бы использовал [MemoryCache] (https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache%28v=vs.110%29.aspx) и избегать головной боли при повторном создании правил выселения кеша и тому подобное. Если вы не нуждаетесь в срочном выселении, то простой словарь будет ... –

+0

@ PatrykĆwiek В конце концов я решил использовать словарь; поэтому ваш комментарий заслуживает кредитов. Не могли бы вы прокомментировать свой комментарий? – SimonAx

ответ

1

[Содействие комментария к ответу]

Я хотел бы использовать MemoryCache, чтобы избежать воссоздавая правила выселения кэша, но и для безопасности и спокойствия.

Если вы используете простейший кеш-ключ в памяти, то IDictionary<TKey,TValue> является очевидной доступной опцией.

Также следите за условиями гонки при использовании словаря. :)

0

Как написано, getCustomerTypes не является функцией. Это значение, которое вычисляется только один раз. Для того, чтобы вынуждать повторное вычисление по каждой ссылке, сделать его функцию:

let getCustomerTypes() = 
    let allTypes = SomeDbFunction |> Seq.map SomeMappingFunction 
    Seq.cache allTypes 

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

Смежные вопросы