全局配额表(t_global_quota)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint(20) | 主键自增ID |
| channel | int(10) | 消息类型(1: 邮件;2: 短信;3: 飞书) |
| num | int(10) | 限频数(单位:秒) |
| unit | int(10) | 限频单位(毫秒)1000=1秒,60000=1分钟 |
业务配额表(t_source_quota)
记录某个业务可发送消息的频率,比如某些平台短信一分钟只能触发一次
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint(20) | 主键自增ID |
| source_id | varchar(256) | 业务ID |
| channel | int(10) | 消息类型(1: 邮件;2: 短信;3: 飞书) |
| num | int(10) | 限频数 |
| unit | int(10) | 限频单位(毫秒)1000=1秒,60000=1分钟 |
用Redis实现限额器#
Redis 是一个高性能的分布式缓存和存储系统,非常适合实现分钟级/秒级额度限制。
实现步骤
定义 Redis 的计数器,键名格式:
rate_limit:{业务ID}:{channel}:{时间戳}
如 rate_limit:source123:2:202412071015 请求时:
使用 Redis 的 INCR 操作递增计数器。
检查计数器是否为1,是的话说明新创建,设置过期时间,比如60s,具体多少取决于传入的参数
检查计数器值是否超过限制。
如果超过限制,返回错误;否则允许请求。
