限流 (Rate Limiting) 用缓存或 NoSQL 存储这些信息 [ 2.0 版本 ]
文档中说到,可以考虑使用 nosql 你也可以考虑使用缓存或 NoSQL 存储这些信息 我看了RateLimitInterface.php
源码 。
没有发现 存储到nosql里面 除了 allowance timestamp; 还有什么?
如果只是按照之前的做法
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
那么按照逻辑 程序无法判断是那个用户,对应当前保存的信息。那么在
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
也无法得到正确的信息。
shuidaan 补充于 2019-10-16 10:20
所以,问题总结,这里限流怎么使用redis 或者其他nosql
共 1 个回答
-
原文内容:
你可以在 user 表中使用两列来记录容差和时间戳信息。 loadAllowance() 和 saveAllowance() 可以通过实现对符合当前身份验证的用户的这两列值的读和保存。 为了提高性能,你也可以考虑使用缓存或 NoSQL 存储这些信息
你可以在 user 表中使用两列来记录容差和时间戳信息
应该是要在user
中多加两个字段$this->allowance, $this->allowance_updated_at
应该是数据库里的字段,读取的是数据库的内容。
那么为了让速率更快,就要将其放在redis
或者其他nosql中伪代码:
public function saveAllowance($request, $action, $allowance, $timestamp) { // 如果要标识客户,可以获取其主键id $user_id = $this->id; $redis->set("allowance_" . $user_id, $allowance); $redis->set("allowance_updated_at_" . $user_id, $timestamp); } public function loadAllowance($request, $action) { $user_id = $this->id; // 缺少校验环节,如果redis中不存在此数据,应该酌情返回一个合适的值 $allowance = $redis->get('allowance_' . $user_id); $allowance_updated_at = $redis->get('allowance_updated_at_' . $user_id); return [$allowance, $allowance_updated_at]; }
省去了保存到数据库和读取数据库的稍微浪费资源的操作。
shuidaan ningbo
注册时间:2016-12-20
最后登录:2023-02-14
在线时长:3小时31分
最后登录:2023-02-14
在线时长:3小时31分
- 粉丝0
- 金钱75
- 威望10
- 积分205