当前位置: 首页 > news >正文

使用 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 thenlocal 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;elsereturn 0;end;elsereturn 0;end;
end;
http://www.lryc.cn/news/289562.html

相关文章:

  • 云上高可用系统-韧性设计模式
  • 【保姆级教程】Windows11下go-zero的etcd安装与初步使用
  • golang通过go-git下载gitlab源码
  • 探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】
  • c++ QT 信号的个人理解 信号就是独立文件调用的一种“协议”
  • C#语法(关键字)
  • 让B端管理软件既美观又实用的解决方案来了
  • npm run dev,vite 配置 ip 访问
  • 实验3:数据显示输出
  • 查看 Avro 格式的 Kafka 消息(启用了 Confluent Schema Registry )
  • QT+VS实现Kmeans聚类算法
  • openssl3.2 - 测试程序的学习 - test\acvp_test.c
  • Qt Quick 项目(第二集Qt Quick Application创建)
  • 深度强化学习(王树森)笔记03
  • Cesium材质特效
  • 华为产业链之车载激光雷达
  • java的Object类的hasCode()和ToString()
  • php数组算法(1)判断一维数组和多元数组中的元素是否相等并输出键值key
  • 已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘float‘.
  • WordPress块编辑器(Gutenberg古腾堡)中如何添加脚注?
  • burpsuite怎么进行本地抓包?ctfer测试自搭建靶场必须学会!
  • VSCode Python调试运行:json编写
  • 自动化Web页面性能测试介绍
  • 可视化 | 【d3】力导向关系图优化(搜索+刷新)
  • 2024.1.26力扣每日一题——计算 K 置位下标对应元素的和
  • R语言【taxlist】——levels():获取或设置分类等级列表
  • 单元测试——题目十三
  • 使用Linux SDK客户端向AWS Iot发送数据
  • 1.27学习总结
  • 【算法专题】二分查找(进阶)