我正在构建一个api产品,用户可以使用多个api(我给他们一个api键)。
我想监视用户进行的api调用,以便能够知道他们进行了多少次调用(扩展一下,要向他们收取多少费用)。
这是我的table: 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的使用率可能非常高(>100req/sec),所以我不能在每次命中api端点时对数据库进行读写调用。
这就引出了一个问题:如何确保维护数据库中这些数据的完整性?
如果我不是每次都写入数据库(比如说,我选择在每1000次调用之后写入),并且如果redis示例宕机,那么数据就丢失了!如何避免这种情况?
1条答案
按热度按时间0lvr5msh1#
有多种解决方案:
首先,您可以持久化redis数据以避免数据丢失。redis的可靠性不低于postgresql或其他任何数据库。
对于同步数据库和redis,可以在一个查询中更新所有数据库行,例如,每15秒更新一次。但要进行查询,您需要知道活动同步上次更新的用户标识,为此,您可以将活动用户标识列表保存在redis集中。