缓存对象以提高性能

时间:2009-11-04 10:30:56

标签: database caching

我在SQL表中存储了一组消息。每条消息都有一个大小,表中有一列包含消息的大小。这些消息已连接到帐户。当新邮件到达时,我需要检查当前帐户大小+新邮件大小是否小于帐户的配额(这只是帐户表中一行中的“maxaccountsize”列)。如果没有,我需要向发件人报告该邮件不适合该帐户。

简化:

Table messages: 
   ID int
   AccountID int
   Size int

Table accounts: 
   ID int
   MaxSize int

要计算每个帐户的总大小,我会从消息WHERE AccountID = 12345执行类似于SELECT SUM(Size)的语句。

在帐户中有数十万条消息的大型用户数据库中,此操作很繁重,并且在接收消息时成为一个巨大的瓶颈。我的软件使用Microsoft SQL Server,MySQL和PostgreSQL作为后端。

为了解决这个问题,我添加了一些内存缓存的值。这对我来说很麻烦,因为我需要实现缓存的线程安全更新,我需要确保缓存始终是最新的。此外,如果有人手动编辑数据库,它也不起作用。

另一种解决方案是将当前帐户大小存储在帐户表中。但是,这意味着我有一些冗余数据(当然,可以说今天的内存缓存已经是这种情况)。如果我选择此解决方案,我需要确保在创建或删除邮件时始终更新帐户大小。这也有点麻烦,我敢打赌,有些时候总和(大小)不等于Accounts行中的CurrentAccountSize值。使用内存缓存,至少在重新启动服务器时它将重置为正确的值。

有没有人对在这些情况下应该做些什么有意见?

1 个答案:

答案 0 :(得分:3)

在这个用例中,我肯定会在您的数据库中存储冗余数据。

您认为您的银行帐户在计算余额时会计算其历史记录中所有交易的总和吗?