2019-10-16 10:20:05 1616次浏览 1条回答 0 悬赏 10 金钱

文档中说到,可以考虑使用 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];
}

也无法得到正确的信息。

补充于 2019-10-16 10:20

所以,问题总结,这里限流怎么使用redis 或者其他nosql

  • 回答于 2019-10-17 09:50 举报

    原文内容:

    你可以在 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
见习主管

shuidaan ningbo

注册时间:2016-12-20
最后登录:2023-02-14
在线时长:3小时31分
  • 粉丝0
  • 金钱75
  • 威望10
  • 积分205

热门问题