我正在开发一个使用postgreSQL数据库中的客户端数据的Java REST API。
数字: 。一开始大约有600个客户 。他们中的一些人每隔几秒就做一次请求
因为客户为每个请求付费,我们需要控制他们的成功请求数量是否达到限制,并且在每个请求在性能方面都不好时查询postgresql数据(更新'hitsCounter'字段的值),我们是考虑使用redis实现缓存系统。
想法: 客户端完成第一次请求后,我们从postgresql中检索他的数据并将其存储到redis缓存中。然后使用此缓存数据,例如递增'hitsCounter'键值,直到客户端停止执行请求。 同时,每隔几分钟,后台进程会将数据从redis缓存持久保存到db表,因此最后我们将更新后的数据恢复到postgresql,我们将来可以处理它们。
我认为它显然会提高性能,但我不确定这个“后台进程”。一个选项是检查缓存元素的TTL,如果它小于某个值(这意味着客户端已完成请求),则保留数据。
我很想听听有关此事的一些意见。这是一个好主意吗?你知道一些更好的选择吗?
答案 0 :(得分:6)
完全合理的想法,但你没有提到你做过的任何测量。目标硬件与目标事务级别的瓶颈是什么?不知道这一点,你不能说。
您也许可以使用未记录的表。只需在每个查询中插入一行,然后每隔5分钟汇总一次,清除旧数据。然后,再次使用HOT更新,并说75%填充因子可能更新更有效。我不知道(也不知道)我们还没有测量过它。
还不够?将它贴在ssd上自己的表空间上。
还不够?把它贴在自己的虚拟机/机器上。
还不够?只需将该死的东西写到每个前端盒上的平面文件中,然后每分钟将数据批量处理到数据库中。
另外 - 他们每次查询支付多少钱?您是否关心电源是否出现故障并且您丢失了五秒的查询日志?您是否需要能够使用原始详细信息和时间戳为每个查询重现收据?