【问题标题】:How to store database data with lots of attributes into cache?如何将具有大量属性的数据库数据存储到缓存中?
【发布时间】:2015-06-27 10:50:29
【问题描述】:

假设我有一个包含 TABLE_ID、CUSTOMER_ID、ACCOUNT_NUMBER、PURCHASE_DATE、PRODUCT_CATEGORY、PRODUCT_PRICE 列的表。 此表包含在某个商店进行的所有购买。

请不要专注于更改数据库模型(有明显改进的可能性),因为这是一个虚构的示例,我无法更改实际的数据库模型,这远非完美的。 我唯一可以更改的是使用现有数据库模型的代码。

现在,我不想一直访问数据库,所以我必须将数据存储到缓存中,然后从那里读取。问题是,我的程序必须支持各种各样的东西:

  1. 客户 X 在 Y 日购买的总价值是多少?
  2. 购买类别 X 的产品的总价值是多少?
  3. 给我一份按 customer_id 分组的总支出清单。

等等

我必须能够在我的缓存中保留此层次结构。
一种可能的解决方案是在地图中放置地图...等等。
但是,这很快就会变得混乱,因为我需要为表中的每个属性设置一个额外的嵌套级别。

有没有更聪明的方法来做到这一点?

【问题讨论】:

    标签: java sql caching


    【解决方案1】:

    您是否已经确定需要缓存?您确定您的应用程序的性能需要它吗?数据库本身可以优化查询,在内存中存东西等。

    如果您确定需要缓存,您还需要考虑缓存失效:数据是否从您的脚下发生变化,即另一个进程正在更改数据库中的数据,或者数据库数据是不可变的,还是您的应用程序是修改数据的唯一进程吗?

    您希望缓存做什么?只需跟踪已请求的查询和结果,以便第二次运行查询时,您可以从缓存中返回结果吗?或者你想积极地预先计算一些聚合?缓存数据是否适合您的应用内存,或者您是否想使用 ReferenceMaps,例如当内存紧张时会缩小?

    对于您的实际问题,为什么需要地图内的地图?您可能应该设计一些更接近您的业务模型的东西,并以有意义的方式存储表示数据的对象。您可以将每个查询(PurchasesByCustomer、PurchasesByCategory)表示为一个对象并将它们存储在不同的映射中,这样您就可以获得某种类型的安全性。同样,不要将地图用于结果,而是使用您想要的实际对象。

    对不起,你的问题很模糊,但希望我给了你一些思考。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多