gpt4 book ai didi

c# - 此特定场景中的最佳缓存策略

转载 作者:行者123 更新时间:2023-11-30 16:23:55 27 4
gpt4 key购买 nike

我正在检索一大堆新闻项目。

出于显而易见的原因,我想利用此列表的缓存(运行超过必要的查询将不会执行)。

我将这个列表绑定(bind)到一个转发器,我在转发器上进行了扩展以启用分页(在页面之间滑动会导致页面加载,因此会再次检索列表)。

复杂的是,这些新闻项也可以从仅在按日期查询新闻项时才存在的查询字符串“year”中按日期查询。

下面是我目前所拥有的伪代码(在这里粘贴真实代码会花费太多时间来删除所有只会增加困惑的位):

if(complete news items list are not cached OR querystring["year"] != null)
{
Int year = queryString["year"] (could be null)
Cache.Add(GetNewsItems(year));
}
else
{
return cached newsItems;
}

问题是,当新闻项目页面加载时(由于分页控件的回发),查询字符串的 [year] 参数仍将被填充,因此将重新执行 GetNewsItems。此外 - 即使主页 URL(即没有查询字符串)随后被导航到 - 实际上仍然存在新闻项目的缓存版本,因此它不会费心尝试检索它们 - 但它们可能在特定年份存在因此与“全年”搜索无关。

我是否添加一个新的缓存条目来标记最近完成的搜索?我必须在这里考虑哪些因素才能缓存超时?如果需要(最好不要),我可以添加一个新的查询字符串 - 这会解决问题吗?

最佳答案

您能否在第一个查询中获得完整列表,并将其缓存(假设它不是太大)?然后对于任何后续查询,从缓存中获取数据并查询它以过滤出您想要的年份。

也许您可以将数据以以下形式存储在缓存中

IDictionary<int, IEnumerable<NewsItem>> 

(假设一年有多个 NewsItem)其中的键是年份,因此您只需检索一个字典值对即可获得一年的数据。

或者按年份缓存数据,就像您在示例中所做的那样,并实现一种机制以从每年的缓存中获取数据(如果存在)。获取所有数据时,您可以只从数据存储中获取所有数据并单独缓存,也可以实现某种机制来确定缓存中缺少哪些年份并只获取这些数据。就个人而言,我认为我会缓存所有数据并从缓存中过滤数据,以免缓存数据过多而阻塞内存。

从缓存中获取的有用的 TryGetValue 模式类似于:

private bool TryGetValue<U>(string key, out U value)
{
object cachedValue = HttpContext.Current.Cache.Get(key);
if (cachedValue == null)
{
value = default(U);
return false;
}
else
{
try
{
value = (U)cachedValue;
return true;
}
catch
{
value = default(U);
return false;
}
}
}

关于c# - 此特定场景中的最佳缓存策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com