我有一个int列表,它以字符串的形式存储在DB中,其间有逗号(4345,324,24,2424,64567,33 ...)。这个字符串可能会变得非常大,包含2-3千个数字。它存储在数据库中并经常使用。
我想的是,不是每次需要时都从DB中读取它,最好在第一次加载后将它存储在会话中。
1,000 int列表需要多少内存?内存大小是否也依赖于int本身,这样存储较大的int(234,332)比较小的int(544)占用更多的空间?
以内存空间为代价读取一次并存储在会话中会更好,或者更好地经常阅读并在渲染后从内存中丢弃。
感谢您的建议。
答案 0 :(得分:7)
我认为你正走向错误的方向。存储在DB中可能是更好的选择,不是以逗号分隔格式,而是作为int值表。
在会话中存储数据会显着降低可扩展性。你可能会开始有OutOfMemory异常,并想知道为什么会这样。
所以我的建议是在需要时从数据库读取,应用适当的索引,它会非常快。
你前进的方式是:
第1天,1位用户 - 嗯,我应该在Session中存储数据,为什么不呢。应该快速工作。无需查询DB。也很容易做到。
第10天,5位用户 - 需要存储另一个数据结构,也会把它放到会话中,为什么不呢?会话非常快。
Day#50,10个用户 - 有一个控制器可以渲染,我会让它变得智能,渲染一次而不是放到Session中,将在每次回发时重复使用它。 < / p>
第100天,20位用户 - 有时网站速度慢,不知道为什么。但有时候,这不是什么大问题。
第150天,50位用户 - 速度很慢。需要更好的CPU和内存?我们需要购买更好的服务器,硬件很旧。
第160天,60位用户 - 拥有一台新服务器,工作速度更快。问题解决了。
Day#200,100位用户 - 再次放慢,为什么?这是最新的最昂贵的服务器!
Day#250,150位用户 - 应用程序池一直在重新启动。为什么? OutOfMemoryException异常?这是什么?我会google。
Day#300,200位用户 - 用户抱怨,我们失去了客户。我读到了WinDbg,需要尝试使用它。
Day#350,200位用户 - 我们是否应该开始使用网络负载平衡,我们可以购买两台服务器!买了服务器,试图使用,没用,很多依赖于Session。
Day#400,200位用户 - 无法获得新客户,老客户消失。开始使用WinDbg发现几乎所有内存都被Session使用。
Day#450,200位用户 - 启动一个名为“摆脱会话”的大项目。
Day#500,250位用户 - 服务器现在非常快。
我去过那儿。基本上我的建议 - 不要这样。
答案 1 :(得分:4)
C#中的int总是4个字节(无论值是多少)。因此,1,000个整数的列表约为4,000个字节。我说大概是因为列表结构会增加一些开销。列表中的几千个整数不应该是现代计算机的问题。
答案 2 :(得分:2)
我不建议将其存储在会话中,因为这会导致内存压力。如果你有一系列整数绑定到一个记录,听起来你错过了多对一关系 - 为什么不将int存储在一个带有原始表的外键的单独表中呢?
答案 3 :(得分:1)
整数在.NET中具有固定大小。假设您将它存储在数组而不是List中(因为您可能不会添加或删除它),它将占用大约32位*元素的数量。数组中的1000个int =大约32000位,或者略低于4 KB。
答案 4 :(得分:0)
int
通常需要32位(4个字节),因此其中1000个大约需要4KB。
数量有多大并不重要。它们总是存放在同一个空间中。
答案 5 :(得分:0)
这个int的列表对于会话是唯一的吗?如果没有,请在服务器级别缓存它并在其上设置到期日期。列表的1份副本。
context.Cache.Add(...
我这样做并且每5分钟用大量数据刷新它。这种方式非常“新鲜”,但只有一个连接需要命中才能填充它。