正在内存中缓存数据库表

本文关键字:数据库 缓存 内存 | 更新日期: 2023-09-27 17:49:32

编辑:

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

我计划将所有或大多数数据库表(加密(缓存在内存中。

我正在开发一个基于云的应用程序,它将有100MB的SQL Server/MMySQL限制,可以由不同的客户端共享。(所以我可以在缓存时按客户端对它们进行分组;甚至可以根据业务模型创建更小的缓存组(

我不知道;100000行、10MB或20MB的数据等的SELECT * FROM需要多少时间才能获取。

我快速搜索了一下,但找不到任何能够说明检索大量行的"大致"持续时间的基准。

我的公司正在使用一种商业软件,这种软件在现代世界大多数中小型公司中都很常见。据说它每天都有活动记录,4.5年内只有20MB的MySQL数据。

我检查了MySQL Administrator,发现最大的表是inventory_movements,有7MB的数据和45000行。

我使用MySQL查询浏览器并执行从该表中选择所有记录。软件工具表示它花费了0.4971秒。现在我想我有个主意了。

在C#中获取所有行(只有纯SELECT * FROM,没有过滤器,联接(;从SQL Server数据库中,7MB数据的45000行将导致类似的持续时间,对吧?如果是2秒或3秒,我还是可以的。

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

我的问题是;

缓存100MB的数据没有任何问题,只要我有足够的资源,对吗?换句话说;一有内存资源就缓存100MB,甚至500MB,1GB,这并不奇怪?

第二;你认为我用SELECT获取记录的时间计算是乐观的吗?

在应用程序启动时;我可以缓存数据;并且在不进行频繁的重新加载高速缓存的情况下管理高速缓存和数据库中的修改/添加/删除的数据。

正在内存中缓存数据库表

我快速搜索了一下,但找不到任何能说明检索大量记录的"大致"持续时间的bencmark。

你永远不会。数据库的响应速度取决于太多的变量,因此不可能对某个人做出回答。服务器的技术规格是什么?您允许服务器有多少个处理器?你是如何索引这张表以便阅读的?

正如你所看到的,组织之外的人无法回答这个问题。

缓存100MB的数据没有任何问题,只要我有足够的资源,对吗?换句话说;我一有内存资源就缓存100MB,甚至500MB,1GB,这不是更好吗?

简而言之,在我开始之前,您对缓存的看法是错误的。让我们思考一下处理器上的缓存。它有什么用?它是用来确保频繁操作发生得更快的,对吗?好吧,这就是数据缓存的用途——但这只是硬币的一面。

让我们谈谈数据缓存存在的第二个原因。假设您有一个每天执行3M以上操作的应用程序。看起来很多,但现实的财富500强公司是吗?然后,使用缓存来确保对频繁使用的数据(甚至是事务驱动的数据(的数据访问不会出现用户可视化的瓶颈。

看,一般来说,瓶颈不会是数据库引擎、处理器、RAM、缓存,甚至网络。一般来说,瓶颈是I/O。好吧,即使是运行16K RPM驱动器的最大、功能最强大的SAN,每天对数据库的读/写次数也超过3M次,这是一种奢望。

那么,我们该怎么做呢?我们将数据分布在多台机器上(以防其中一台机器因负载平衡而出现故障(,并将其存储在RAM中。为什么?因为这是最快的I/O,简单。

所以,我说了这么多,也就是说,除非你每天执行数百万次操作,否则你很可能需要缓存500MB或1GB的数据。事实上,从您的问题中还不清楚您到底想执行什么,因为其中没有"这是我的应用程序所做的">,但您可能根本不需要缓存。

记住这一切。数据缓存不是一件小事。

假设数据库服务器和web服务器在同一台机器上,您不会受到网络延迟的影响,因此唯一需要考虑的时间是从数据库中获取数据的时间,以及在web服务器中构造对象的时间。如果你能快速实现对象实例化(如果它们是数据表的表示,这应该是可能的(,那么你的估计就不是非常乐观了——这确实在一定程度上取决于你需要做的选择语句的数量。

就我个人而言,我只建议缓存很少更改的数据表,除非缓存到位以避免大量查询——就本文而言,我认为您的设计决策是合理的。

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

另一方面,它可能会质疑在内存中缓存大量数据的必要性,特别是当你说数据库在同一台服务器上时。

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