如果在整个站点上将标志设置为true
,则必须显示多个部分视图。在整个站点上设置标志的正确方法
我在web.config
文件中有硬编码标志,并且工作正常。但现在这个标志必须通过我们的后端设置。
该网站有很多的流量,我需要一个适当的方式来达到这一点,我觉得只是做一个SQL请求只是为了检查这个标志是一个矫枉过正。
我虽然关于阅读一个简单的txt文件包含国旗,但我不知道它是否仍然“太多”。
怎么会是最优化的方式?
如果在整个站点上将标志设置为true
,则必须显示多个部分视图。在整个站点上设置标志的正确方法
我在web.config
文件中有硬编码标志,并且工作正常。但现在这个标志必须通过我们的后端设置。
该网站有很多的流量,我需要一个适当的方式来达到这一点,我觉得只是做一个SQL请求只是为了检查这个标志是一个矫枉过正。
我虽然关于阅读一个简单的txt文件包含国旗,但我不知道它是否仍然“太多”。
怎么会是最优化的方式?
结账MemoryCache
。您可以使用静态属性创建一个基本的静态类,以返回缓存的标志值,然后您可以定义一个绝对过期时间,以适应您可以接受的任何安慰水平(5秒或60分钟或任何时间段)缓存中的值。
这是处理线程的一个非常快速的例子。
public static class CacheStore
{
private static readonly string _keyMySharedFlag = "shared.flag";
private static readonly object _lockMySharedFlag = new object();
public static bool MySharedFlag
{
get
{
var cachedFlag = (bool?)MemoryCache.Default.Get(_keyMySharedFlag);
if (cachedFlag != null)
return cachedFlag.Value;
lock (_lockMySharedFlag)
{
// Confirm no other threads wrote to cache while we waited
cachedFlag = (bool?)MemoryCache.Default.Get(_keyMySharedFlag);
if (cachedFlag != null)
return cachedFlag.Value;
bool? newFlag = true; // Set to your database value
var cachePolicy = new CacheItemPolicy();
cachePolicy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(5); // 5 minutes
MemoryCache.Default.Set(_keyMySharedFlag, newFlag, cachePolicy);
return newFlag.Value;
}
}
}
}
我想我会用很多,谢谢。 –
它运行的很好,但它似乎持续超过5分钟,实际上我等了20分钟,值仍然是相同的,直到我刷新应用程序池,然后它将修改后的值。我复制了完全相同的代码,并将'newFlag'值设置为我的数据库驱动值。任何想法?提前致谢。 –
刷新应用程序池可以完全清除缓存。为了调试你的问题,我会将cachePolicy过期改为DateTimeOffset.Now.AddSeconds(1),然后在var cachedFlag的第一行放置一个断点,以便逐步调用MemoryCache调用并查看值到达的位置从。随着这种变化,应该立即从缓存中清除现有值。此外,请确保您没有设置“滑动游戏”而不是“绝对游戏”。 –
我会建议定义一个全局配置类,其中包含所有的标志,常用数据,并使用依赖注入将其注入到任何你需要的地方。这将导致我相信更可测试的解决方案。
'但现在这个标志必须通过我们的后端设置。“你是什么意思? – ramiramilu
我想说的是这个标志不能被硬编码了。其他人(我们的客户,非开发人员)必须能够更改该值,而不必直接在'web.config'上修改它。 –