【发布时间】:2010-10-20 09:41:35
【问题描述】:
我有一个 ASP.NET MVC 2 Web 应用程序(.NET 4,C#),用户可以在其中搜索位置。
该页面使用自动完成框实现,类似于许多网站。 (谷歌、YouTube 等)
现在,对服务器的 AJAX 调用导致对数据库的存储过程调用。 (虽然效率很高,但可能会导致打字速度慢的人进行大量往返)。
我想知道如何创建一个策略来缓存最近 100 次搜索的结果?
我不能使用 OutputCache,因为调用是通过客户端的 AJAX 进行的。我需要缓存存储过程的输出(查询文本的匹配位置列表)。
换句话说,很多人会搜索“纽约”或“旧金山”,而这些数据只能通过手动管理员更改(例如,我们可以手动使缓存无效)来更改。
那么,我如何缓存最后 100 次搜索?我希望有一个类似 FIFO 的功能,如果缓存已经有 100 次搜索,最旧的会被丢弃,所有内容都会被移下。
我希望代码是这样的:
public ICollection<MatchedLocation> FindLocations(string queryText)
{
// Check last 100 searches.. How?
string cacheKey = queryText;
var matchedLocations = cachedPersistence.Get(cacheKey);
if (matchedLocations == null)
{
// Call db
matchedLocations = dbPersistence.GetLocations(queryText);
// Add to cache
cachedPersistence.Add(cacheKey, matchedLocations);
}
else
{
// Found in Cache! Awesome!
return matchedLocations;
}
}
我认为显而易见的选择是 .NET Queue?
但我以前从未使用过它,有什么建议吗?我将如何为 get/set 实现并发,我需要使用完全锁定的单例吗?有没有人为此使用队列?我们还有哪些其他选择?我几乎需要一个自定义队列来限制堆栈中的项目数量。
感谢您的帮助。
【问题讨论】:
标签: c# asp.net caching queue fifo