【问题标题】:Web Service Architecture: Redis (as cache) & PostgreSQL for persistenceWeb 服务架构:Redis(作为缓存)和 PostgreSQL 用于持久性
【发布时间】:2013-04-20 11:55:35
【问题描述】:

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

数字: .初期客户约600家 .他们中的一些人每隔几秒就发出一次请求

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

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

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

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

【问题讨论】:

  • 你设法让它工作了吗?你是如何做到 Redis-to-Postgres 持久化的?

标签: java postgresql rest architecture redis


【解决方案1】:

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

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

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

还不够?将其粘贴在自己的虚拟机/机器上。

还不够?只需将这些该死的东西写入每个前端机器上的平面文件,然后每分钟将数据批处理一次到数据库中。

另外 - 他们为每个查询支付多少费用?您是否关心电源故障并丢失五秒钟的查询日志?您是否需要能够为每个查询复制带有原始详细信息和时间戳的收据?

【讨论】:

  • 谢谢你,Richard,很高兴听到关于未记录表的消息,我不是 Postgresql 专家,所以我不知道这个选项的存在。关于我们的测量,我们正在预测问题,但我们仍然没有关于此的真实统计数据。目前我们知道我们需要一个缓存,以及潜在客户的数量,仅此而已:) 首先,我将在没有缓存的情况下实现系统并使用一些指标,然后添加 redis。关于您的问题:我们认为现在丢失 5 秒的查询日志并不重要。系统将在没有自动回执的情况下工作。
  • 假设查询请求是用客户的 ID 记录的,我很想懒惰地解析日志文件并批量更新数据库。我觉得这是最简单的解决方案。
猜你喜欢
  • 2012-06-28
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2014-12-14
  • 1970-01-01
  • 2020-12-18
  • 2011-03-21
相关资源
最近更新 更多