2013-04-26 47 views
3

我正在开发使用来自postgreSQL数据库的客户端数据的Java REST API。Web服务体系结构:Redis(作为缓存)和PostgreSQL的持久性

的数字: 。开始时约有600个客户端 。他们中的一些人每隔几秒做一次请求

由于客户端为每个请求付费,因此我们需要控制它们的请求数是否达到其限制,并且在每次请求之后查询postgresql数据(更新'hitsCounter'字段的值)在性能方面不好,我们正在考虑使用redis来实现缓存系统。

理念:客户做他的第一个请求 后,我们从PostgreSQL的找回了自己的数据,并将其存储到Redis的缓存。然后使用这个缓存数据,例如增加'hitsCounter'键值,直到客户端停止请求。 同时,后台进程每隔几分钟就会将数据从redis缓存保存到db表中,因此最终我们将更新后的数据返回给postgresql,我们可以在将来处理它们。

我认为这显然会提高性能,但我不确定这个“后台进程”。一个选项是检查缓存元素的TTL,如果它小于某个值(这意味着客户端已完成请求),则保留数据。

我很想听听关于此的一些意见。这是一个好主意吗?你知道一些更好的选择吗?

回答

5

完全合理的想法,但你没有提到你所做的任何测量。您的目标硬件与目标交易级别有什么瓶颈?不知道,你不能说。

您可能会使用未记录的表格。只需在每个查询中插入一行,然后每5分钟总结一次,清除旧数据。然后,再次,与HOT更新,并说75%的填充因子可能更新更有效率。我不知道(也不是)我们没有测量过它。

不够?把它贴在自己的ssd表空间上。

不够?把它贴在自己的虚拟机/机器上。

不够?只需将该死的东西写入每个前端盒子上的平面文件,并将数据每分钟一次批量添加到数据库中即可。

此外 - 他们多少钱支付每查询?你关心电源是否失效,并且你失去了五秒钟的查询日志?您是否需要能够为每个查询重新生成收据,包括原始细节和时间戳?

+0

谢谢Richard,很高兴听到有关未记录的表格,我不是Postgresql的专家,所以我不知道这个选项的存在。 关于我们的测量,我们正在预测这些问题,我们还没有真实的统计数据。目前我们知道我们需要一个缓存和潜在的客户端数量,这都是:)首先,我将在没有缓存的情况下实现系统,并使用一些指标,之后我将执行相同的添加redis。 关于您的问题:我们现在认为,丢失5秒的查询日志并不重要。系统将无自动收据。 – Emilio 2013-04-30 10:02:10

+1

假设查询请求与客户的ID一起记录,我只想懒惰地解析日志文件并批量更新数据库。这是我最简单的解决方案。 – 2013-04-30 10:07:15

0

我认为你的方法是一个好主意。

就我个人而言,我会做一个永久运行的新线程(while (true))。我不会创建两个线程:同一个线程统计请求将数据存储到数据库中。

--Thread

while (true) 
{ 
    if (newHit) 
    { 
     hits++; 
     //code.. 
     if (hits==30) //for example 
     storeDatainDB(dataInCache); 
    } 
} 
+1

非常感谢Asier,您的方法是一个好主意,但是,如果客户端完成请求并且计数器仍然小于30,会发生什么情况?这就是我更喜欢“时间”方法的原因。 – Emilio 2013-04-30 09:54:36

+0

你确实有一个点。 – 2013-04-30 09:58:02