在内存中缓存数据库表

时间:2012-12-27 00:11:03

标签: c# .net database caching

编辑:

  

我正在寻找缓存大数据的原因(整个数据库,还是很多   表)可能是因为数据库列是加密的,即使是   具有对称rijndael密钥的不同IV向量的不同行。   因此SQL过滤不是选项,索引没有意义。也是应用程序,实际上它   是一个云和业务应用程序的框架,正在设计中   尽可能独立于数据库。你会建议加密   只有一些表的columuns才真正敏感   信息,如电子邮件地址或SSN,但这将使   框架非标准,您需要编写新的加密代码   columuns和每个不同应用程序的未加密columuns。   如果缓存没有问题,那么我可以进行所有操作   对象基础,词典,linq等。当然我必须同步数据库   和缓存。

我打算在内存中缓存所有或大多数数据库表(加密)。

我正在研究基于云的应用程序,它将具有100MB的SQL Server / MySQL限制,将由不同的客户端共享。 (因此我可以在缓存时按客户端对它们进行分组;甚至可以根据业务模型创建较小的缓存组)

我不知道;要获取100000行,10 MB或20 MB数据等SELECT * FROM需要多长时间。

我进行了快速搜索,但找不到任何基准来说明“大致”检测大量行的持续时间。

我的公司正在使用现代世界大多数中小型公司常用的商业软件。据说它每天都有活跃的记录,并且在4。5年内只有20MB的MySQL数据。

我检查了MySQL Administrator,看到最大的表是inventory_movements,并且有7MB的数据,有45000行。

我使用MySQL Query Browser并执行以从该表中选择所有记录。 软件工具声明 0.4971秒。现在我觉得我有个主意。

在C#.NET中获取所有行(仅纯SELECT * FROM,无过滤器,连接);从SQL Server数据库,7MB数据--45000行将导致相似的持续时间,对吗?我还是好的,如果它是2或3秒。

这样;至少我有个主意;如果我缓存100MB数据;它可能需要5到30秒。 (数据在获取期间不会被解密)(稍后需要在RAM中解密)(我知道我放弃了大部分数据库功能。查询将基于缓存中的对象)(我是在写这篇评论时才开始思考;如果我成功了;我甚至可以使用xml作为免费的数据库源,因为我正在设计这个应用程序的OR / M函数)

我的问题是;

只要资源充足,缓存100MB数据没有任何问题吗? 换一种说法;只要有内存资源,缓存100 MB甚至500 MB,1 GB并不奇怪吗?

其次;您是否认为我使用SELECT获取记录的时间计算是乐观的?

申请开始时;我可以缓存数据;并在缓存和数据库中管理修改/添加/删除的数据,而无需频繁重新加载缓存。

3 个答案:

答案 0 :(得分:3)

  

我进行了快速搜索,但未找到任何说明“大致”检测大量记录的持续时间的bencmark。

你永远不会。数据库响应的速率取决于很多变量,对某些人来说是不可能回答的。什么是服务器的技术规格?您允许服务器拥有多少个处理器?你是如何索引表格进行阅读的?

正如您所看到的,组织外的某些人无法回答。

  

只要资源充足,缓存100MB数据没有任何问题吗?换一种说法;一旦有了记忆资源,就不会缓存100MB,甚至500MB,1GB?

简而言之,在我开始之前,你正在从错误的角度看待缓存。让我们考虑一下处理器上的缓存。它用于什么?它用于确保频繁操作更快发生吗?嗯,这就是数据缓存的用途 - 但这只是硬币的一面。

让我们谈谈数据缓存存在的第二个原因。假设您的应用程序每天执行3M +操作。看起来很多,但财富500强公司的现实是吗?那么,缓存然后用于确保数据访问常用数据 - 甚至是事务驱动数据 - 没有用户可视化的瓶颈。

一般来说,看到瓶颈不是数据库引擎,处理器,RAM,缓存,甚至是网络。一般来说,瓶颈是I / O.好吧,读取/写入数据库3M +每天一次,即使是最大和最强大的SAN运行16K RPM驱动器,也不能期望。

那么,我们做什么,我们将数据分布在多台机器上(以防万一用于负载均衡)并将其存储在RAM中。为什么?因为它是最快的I / O,很简单。

所以,我说了这一切,除非你每天要执行数百万次操作,否则你可能需要缓存500MB或1GB的数据。事实上,从你的问题中不清楚你究竟要尝试什么,因为那里没有“这就是我的应用程序所做的”,但是你可能不需要缓存在所有

记住所有这些。数据缓存并非易事。

答案 1 :(得分:1)

鉴于数据库服务器和Web服务器位于同一台计算机上,您不会受到网络延迟的影响,因此唯一需要考虑的时间是从数据库中获取数据,以及构建您的数据的时间Web服务器中的对象。如果您可以快速进行对象实例化(如果它们是数据表的表示,则应该可以实现),那么您的估计值并不是非常乐观 - 这确实取决于您需要执行的select语句的数量。

就个人而言,我只建议缓存几乎没有变化的数据表,除非缓存到位以避免繁重的查询 - 我会假设为了这篇文章的目的,你的设计决定是合理的。

答案 2 :(得分:0)

如果要缓存大量数据,则需要考虑对该数据进行操作,例如排序或搜索需要时间。现在,如果你从未做过这些任务,你就不必担心了。

另一方面,它可能会质疑是否需要在内存中缓存大量数据,特别是当您说数据库位于同一服务器上时。

当您拥有静态且不变的数据时,最好使用缓存。你处理它&在您的情况下,包括解密和&存储它,从而节省未来访问每次做同样的工作。