我必须创建一种机制来存储和读取每个用户的首选项(控制默认值和设置)。我有一个与网络流量有关的问题,因为可以通过 Internet 访问数据库,并且应用程序服务器有时连接到较差的 512Kbps Internet 连接。
我的应用程序可以同时拥有大约 50 个用户,每个页面/表单最多可以有 50 个项目(首选项)。页数约为 80 页。
那么,从性能角度考虑,我应该选择哪个来减少网络流量?会话还是缓存?
更新
我创建了两个示例页面,一个使用缓存,另一个使用会话。
负载测试 90 个用户
存储内容 1000 个元素 每个元素的值 20 个字符
以下是每个测试用例的结果:
MemoryCache 分配的总字节数为 330,725,246
分配最多内存的函数
名称字节 % System.Runtime.Caching.MemoryCache.Set(string,object,class System.Runtime.Caching.CacheItemPolicy,string) 34,74 System.Web.UI.Page.ProcessRequest(类 System.Web.HttpContext)18,39 System.String.Concat(字符串,字符串)12,65 System.String.Join(string,string[]) 5,31 System.Collections.Generic.Dictionary`2.Add(!0,!1) 4,42
源代码:
protected void Page_Load(object sender, EventArgs e)
{
outputPanel.Text = String.Join(System.Environment.NewLine, ReadEverything().ToArray());
}
private IEnumerable<String> ReadEverything()
{
for (int i = 0; i < 1000; i++)
{
yield return ReadFromCache(i);
}
}
private string ReadFromCache(int p)
{
String saida = String.Empty;
ObjectCache cache = MemoryCache.Default;
Dictionary<int, string> cachedItems = cache["user" + Session.SessionID] as Dictionary<int, string>;
if (cachedItems == null)
{
cachedItems = new Dictionary<int, string>();
}
if (!cachedItems.TryGetValue(p, out saida))
{
saida = Util.RandomString(20);
cachedItems.Add(p, saida);
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(30);
cache.Set("user" + Session.SessionID, cachedItems, policy);
}
return saida;
}
会话 分配的总字节数为 111,625,747
分配最多内存的函数
名称字节 % System.Web.UI.Page.ProcessRequest(类 System.Web.HttpContext)55,19 System.String.Join(string,string[]) 15,93 System.Collections.Generic.Dictionary`2.Add(!0,!1) 6,00 System.Text.StringBuilder.Append(char) 5,93 System.Linq.Enumerable.ToArray(类 System.Collections.Generic.IEnumerable`1)4,46
源代码:
protected void Page_Load(object sender, EventArgs e)
{
outputPanel.Text = String.Join(System.Environment.NewLine, ReadEverything().ToArray());
}
private IEnumerable<String> ReadEverything()
{
for (int i = 0; i < 1000; i++)
{
yield return ReadFromSession(i);
}
}
private string ReadFromSession(int p)
{
String saida = String.Empty;
Dictionary<int, string> cachedItems = Session["cachedItems"] as Dictionary<int, string>;
if (cachedItems == null)
{
cachedItems = new Dictionary<int, string>();
}
if (!cachedItems.TryGetValue(p, out saida))
{
saida = Util.RandomString(20);
cachedItems.Add(p, saida);
Session["cachedItems"] = cachedItems;
}
return saida;
}
我忘了提到我正在创建一个与 ASP.Net 和 WPF 项目一起使用的解决方案,但是,如果 Session 比 MemoryCache 选项好得多,我可以为每个平台提供不同的解决方案。