如何在 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_data
和 dog_data
。
现在,当我处理与 cat_data
和 dog_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 表行之间同步值?的主要内容,如果未能解决你的问题,请参考以下文章