使用 sorted set 实现令牌桶限流

业务场景为限制消息发送,要求每天不超过一次,每七天不超过三次

Redission 的 RRateLimiter 虽然功能完备且支持自定义限流配置,但是每个限流器都需要维护三个 key,并且 lua 脚本中的判断逻辑较为复杂。

见:Redisson 分布式限流器 RRateLimiter 的使用及原理

此外,本业务场景每次固定只需要获取一个令牌,且时间等限流参数固定,因此完全可以通过一个 sorted set 实现令牌桶限流。

对应 lua 脚本:

-- sorted set 令牌桶的 key 
local key = KEYS[1];
-- 当前日期 格式为 yyyy-MM-dd
local member = ARGV[1];
-- 当前日期 0 点对应的时间戳 单位为秒
local timestamp = tonumber(ARGV[2]);

local exists = redis.call('exists', key);
if exists == 0 then
    -- 创建并授权
    redis.call('zadd', key, timestamp, member);
    redis.call('expire', key, 7 * 24 * 60 * 60);
    return 1;
else
    -- 移除七天前的授权记录 本质是回收令牌
    local sevenDaysAgo = timestamp - 7 * 24 * 60 * 60;
    redis.call('zremrangebyscore', key, '-inf', sevenDaysAgo);
    
    -- 如果队列长度少于 3 则尝试进行授权
    local length = redis.call('zcard', key);
    if length < 3 then
        local count = redis.call('zcount', key, timestamp, timestamp);
        if (count == 0) then
            -- 每天不超过一次
            redis.call('zadd', key, timestamp, member);
            redis.call('expire', key, 7 * 24 * 60 * 60);
            return 1;
        else
            return 0;
        end;
    else
        return 0;
    end;
end;

相关推荐

  1. 使用 sorted set 实现令牌

    2024-01-25 17:12:03       41 阅读
  2. RedisTemplate实现令牌

    2024-01-25 17:12:03       11 阅读
  3. golang版本使用令牌算法来实现的策略

    2024-01-25 17:12:03       35 阅读
  4. 分布式——Redis实现令牌算法

    2024-01-25 17:12:03       16 阅读
  5. 【Go】令牌算法

    2024-01-25 17:12:03       19 阅读
  6. 微服务(漏算法、令牌算法)

    2024-01-25 17:12:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-25 17:12:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-25 17:12:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-25 17:12:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-25 17:12:03       20 阅读

热门阅读

  1. ubuntu20.04 格式化 硬盘 扩展硬盘

    2024-01-25 17:12:03       39 阅读
  2. Pytest基础

    2024-01-25 17:12:03       45 阅读
  3. 腾讯云个人服务器价格表,2024精准报价

    2024-01-25 17:12:03       47 阅读
  4. Spring和Spring Boot的区别

    2024-01-25 17:12:03       37 阅读
  5. 提升平台工程中的开发人员体验的6大策略

    2024-01-25 17:12:03       34 阅读
  6. 10Docker Compose快速入门

    2024-01-25 17:12:03       35 阅读
  7. vue.js的二十个知识点小结

    2024-01-25 17:12:03       36 阅读
  8. 三维重建衡量指标记录

    2024-01-25 17:12:03       38 阅读