如何在 redis 和 PostgreSQL 表行之间同步值?

Posted

技术标签:

【中文标题】如何在 redis 和 PostgreSQL 表行之间同步值?【英文标题】:How to sync values between redis and PostgreSQL table rows? 【发布时间】:2021-03-05 11:16:52 【问题描述】:

我正在构建一个 API 产品,用户可以在其中使用多个 API(我给他们一个 API 密钥)。

我想监控用户进行的 api 调用,以便能够了解他们进行了多少次调用(以及向他们收取的费用)。

这是我的桌子:user_apis

| API Name | User ID | Total API calls | Successful API calls | Failed API Calls |
|----------|---------|-----------------|----------------------|------------------|
| cat_data | 1       | 15              | 10                   | 5                |
| dog_data | 1       | 3               | 3                    | 0                |
| cat_data | 2       | 1               | 0                    | 0                |

用户可以使用不同类型的 API,例如 User 1 使用 2 个 API cat_datadog_data

    现在,当我处理与 cat_datadog_data API 对应的路由时,我需要在某种中间件中快速监控 API 调用。

    如果用户 1 的 API 密钥命中 cat_data 的端点 => 现在我正在以非常粗略的格式计算 redis 中的命中 key=[user_api_key_total_calls], value=[number_of_calls+1],我已经构建了一种 API 网关中间件,通过它每个请求在redis中通过并被跟踪。

我需要使用 redis(或内存存储中的一些),因为这些 API 的使用率可能非常高(>100 req/sec),因此我无法在每个 API 端点命中时对数据库进行读写调用。

这给我们带来了一个问题:我如何确保我维护数据库中这些数据的完整性?

如果我不是每次都写入数据库(比如说,我选择在每 1000 次调用后写入)并且如果 redis 实例出现故障,那么该数据就会丢失!我该如何避免这种情况?

【问题讨论】:

你检查过 Redis Write-Behind 解决方案吗? github.com/RedisGears/rgsync 会检查一下,谢谢!虽然,我希望在我现有的 API 处理代码中可以遵循某种标准模式/库,以免使我的技术堆栈进一步复杂化。 【参考方案1】:

对此有多种解决方案:

首先,您可以persist the Redis data 避免数据丢失。 Redis reliability 不小于 PostgreSQL 或任何其他数据库。

对于同步数据库和 Redis,您可以在一个查询中更新所有数据库行,每 15 秒一次(例如)。但要进行该查询,您需要知道活动同步上次更新的用户 ID,为此,您可以将活动用户 ID 列表保存在 Redis set 中。

【讨论】:

以上是关于如何在 redis 和 PostgreSQL 表行之间同步值?的主要内容,如果未能解决你的问题,请参考以下文章

如何:通知应用程序数据库表行已更新?

使用 Postgres 排除约束限制匹配特定条件的表行数?

postgresql和redis

可以在 PostgreSQL 端验证 JSON 吗?

postgresql+redis缓存

如何在 SQL 中删除多个 MySql Apache 表行?