【问题标题】:Very slow performance structure非常慢的性能结构
【发布时间】:2012-06-15 10:08:32
【问题描述】:

由于我没有错误,我不知道这是不是问这个问题的正确地方,如果不是,请指点我到正确的论坛。无论如何...

我正在处理一个社交网络项目,现在它运行速度非常慢,有些页面需要 5 到 15 秒才能加载。有一个“缓存”结构,但无论谁这样做,都没有使用已经从 c# .net 构建 Cache,而是创建了一个静态 List<object> 作为系统的缓存。连tightt都不对,我可以处理...

问题是,在每个页面请求上,我都必须从这个 cache 加载用户数据,这个 cache 非常大,而且用户结构也非常大,所以我想知道,而不是从每次请求页面时都缓存我将创建一些会话,其中包含每个页面需要的最常用数据,例如照片、姓名、昵称、id,而不是当我需要从用户那里加载不常见的任何其他类型的数据时,我从缓存中请求它...

我不知道这是否是正确的方法,也不知道这是不是问这个问题的正确地方,但我真的需要非常糟糕地解决这个问题。所以我想从这里的专家那里得到一些建议。

【问题讨论】:

  • 是否有数据库存储所有这些数据?如果是这样,并且它是一个不错的数据库引擎,并且位于本地网络上,我相信它会为您将数据缓存在内存中。当数据库引擎已经在自己缓存它并且可能更有效时,您没有理由自己缓存它。
  • 请发布您从“静态列表”中选择当前用户对象的代码。
  • 是的,有一个数据库 MsSql Server 我认为从服务器缓存中获取它比从数据库中获取它要快得多,不是吗?这是它的屏幕。由于realations没有出现,我现在不知道为什么,希望你能理解[link]imageshack.us/photo/my-images/689/databasee.jpg
  • 嘿@Blam 我会尝试在此处发布代码,但由于它不仅是一个类,我想我不能。加载方法加载“每种类型的项目”让我们这样说......用户是一种类型的项目,并且有自己的唯一 ID,所以我将 ID 传递给方法,然后我给我带来了一个包含项目每个数据的对象我刚刚通过...负载的作用是,从缓存中获取,如果不在缓存中,则从数据库中获取,插入缓存,返回数据...
  • 好的,我会尽快发布答案

标签: c# .net performance caching


【解决方案1】:

部分性能问题可能是需要扫描缓存中的项目。字典可能会更好,因为您可以按键检索项目。这是更接近原生缓存结构的实现。

会话不利于网站的可扩展性。如果您打算将其与 facebook 或其他东西一样大,则使用会话进行缓存会杀死您

查看其他相关问题:

What is a good way to store large temporary "session" data in a web application

还有一个不错的问题

Why is it a bad idea to use Session to store state in high traffic websites?

【讨论】:

  • 好吧,杰森,我不打算在会话中存储大数据,只是每个页面上需要的用户 ID、姓名、昵称和照片,我不打算杀死缓存当然,只是想尽量减少每次加载页面时,我都必须阅读包含数千条记录的列表才能从中仅获取 4 或 5 条...但是感谢您提供链接,它会给我一些帮助
  • @rpmlins 等等,读取包含数千条记录的列表只得到 4 或 5 条记录?你真的需要一个字典在这里。当然,更好的解决方案是直接从数据库加载它。 如果根据您的查询参数对表进行索引,它将是即时的
  • 即使数据库很大?它可以轻松快速地通过百万记录
  • 假设一个不错的数据库具有良好的索引,一百万条记录是微不足道的
  • 然而,仅仅从一个列表切换到一个字典可能会给您带来显着的性能提升,因为您不必每次都搜索整个列表。但是,这并不能解决将缓存保留在内存中的可扩展性问题
【解决方案2】:

同意杰森+1

根据您的评论,用户对象有一个键 (ID)。

如果你有钥匙的话,字典会快得多。此外,如果您的对象具有可以表示为 Int32 的自然键,则覆盖 gethash 和 equals。针对 10,000 的字典查找应该是毫秒。

键控集合听起来像您所需要的。对于键控集合,其中一个属性 (ID) 是键。
keyedcollection

如果这是一个静态列表,我会通过数据库查找字典。因为你有一个单键字典会打败数据库。如果它是复合键,那么您将不得不使用数据库进行索引查找。

【讨论】:

  • 密钥不是 Int32 它是uniqueidentifier 有问题吗?
  • 完全没有问题。然后你就不要覆盖 gethash。 Gethash 只是一个调整,并不是必不可少的。
  • @JasonCoyne KeyedCollection 所做的是直接从对象中使用 Guid,而不是重复它作为键。但是 Dictionary 将以相同的速度在这种情况下工作。
  • 非常感谢你们。我会将List 替换为Dictionary 并进行所有重构,一旦我完成它,我就会回到这里告诉结果。可悲的是,由于我的声誉太低,我不能投票给 asnwers 和 cmets,但一旦它提出,我就会回来,这是我所能做的,再次感谢你们。很多!
  • @JasonCoyne 我同意我们中的一个人应该得到答案。我喜欢我的回答,但他用了你的。嘿,我给了你一个 +1
猜你喜欢
  • 2021-05-24
  • 2014-06-05
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多