Web服务架构:Redis(作为缓存)和PostgreSQL用于持久性

我正在开发一个使用postgreSQL数据库中的客户端数据的Java REST API。

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

由于客户按要求付费,我们需要控制他们的成功请求数量是否达到限制,并且在每次请求性能不佳后查询postgresql数据(更新’hitsCounter’字段的值)时,我们正在考虑实施一个带redis的缓存系统。

想法:在客户端完成第一次请求后,我们从postgresql中检索他的数据并将其存储到redis缓存中。 然后使用此缓存数据,例如递增’hitsCounter’键值,直到客户端停止执行请求。 同时,后台进程每隔几分钟就会将数据从redis缓存持久存储到db表,所以最后我们将更新后的数据恢复到postgresql,我们将来可以处理它们。

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

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

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

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

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

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

不够? 只需将该死的东西写到每个前端盒上的平面文件中,然后每分钟将数据批量处理到数据库中。

另外 – 他们每次查询支付多少钱? 您是否关心电源是否出现故障并且您丢失了五秒的查询日志? 您是否需要能够使用原始详细信息和时间戳为每个查询重现收据?

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

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

– 线

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