存储Web应用程序设置和选项的最佳方式

时间:2017-02-23 17:39:45

标签: c# asp.net-mvc settings

我正在开发一个ASP.Net MVC 5网络应用程序,它是一个博客,并有一个管理员区域。管理区域有一些功能,比如用户可以对帖子等进行评论......但是管理员可能会改变主意,他只想让注册用户发表评论。我的意思是选项是动态的。

问题是在哪里存储这些选项的数据是最好的地方?

我因为频繁的查询而避免为这些数据创建表格!

我的第二个想法是使用数据库和缓存,但我正在寻找实现它的最佳方法......

有更好的主意吗?

4 个答案:

答案 0 :(得分:2)

将其存储在数据库中。那部分很容易。如果您担心过多地查询数据库,请将查询结果缓存一段时间。最简单的,看起来像是:

ObjectCache cache = MemoryCache.Default;

var key = "MyAwesomeSettings";
var settings = cache.Get(key);
if (settings == null)
{
    settings = // query settings;
    cache.Add(key, settings, DateTimeOffset.UtcNow.AddHours(1));
}

然而,MemoryCache的一个关键问题是它受进程限制。如果您正在使用Web工作者,那么每个工作人员将拥有一个唯一的缓存,因为每个工作者都是一个单独的进程。但是,您可以使用像Redis这样的NoSQL解决方案来创建可以在工作人员之间共享的分布式缓存,并且更具弹性。

答案 1 :(得分:1)

使用数据库表存储数据,如果数量不是太大,用户登录时,检索数据一次并将其存储在用户会话对象中以便快速访问。

答案 2 :(得分:1)

我在我维护的Web应用程序中执行相同的操作。除非您有很多(如数千或数百万)不同的设置或极慢的数据库,否则保存数据库中的设置并在每次需要时检索所需的特定设置应该没问题。如果您担心数据库性能,可以在用户登录时检查它们,并将它们保存为会话(如果它们是特定于用户的)或应用程序变量。但是,用户不会在下次登录后立即看到更改。

就个人而言,我会首先使用纯数据库选项并测试它。如果它的性能不够好,切换到会话/应用程序变量选项将是微不足道的。

答案 3 :(得分:1)

将主存储库保留为数据库,但是从缓存中提供请求。对于缓存循环(可能在内存中,甚至在外部/分布式缓存中)的情况,您的数据库总是实际存储

在应用启动时或首次访问管理员操作时缓存频繁更改的设置。

为缓存提供所有后续操作。对设置的任何更改,更新到缓存和从缓存更新。

每小时左右运行一个作业/服务来同步缓存和数据库。

优点:

  • 访问速度很快,因为它来自缓存。
  • 更新很快,因为它是缓存。
  • 非常少且可预测的数据库访问。

缺点:

  • 数据库最多会落后一个小时左右。
  • 如果是高速缓存回收,您将拥有一小时的旧陈旧数据,但绝不会完全丢失。