|
|
@@ -213,6 +213,7 @@ src/
|
|
|
本系统使用不同的 Redis 数据结构来实现固定窗口和滚动窗口的日限额追踪。理解这些命名规范对于调试、监控和故障排查至关重要。
|
|
|
|
|
|
**核心设计原则**:
|
|
|
+
|
|
|
- 固定窗口使用 STRING 类型,支持自定义重置时间
|
|
|
- 滚动窗口使用 ZSET 类型,提供精确的时间窗口计算
|
|
|
|
|
|
@@ -230,6 +231,7 @@ src/
|
|
|
```
|
|
|
|
|
|
**特性**:
|
|
|
+
|
|
|
- Redis 类型:STRING
|
|
|
- 操作命令:INCRBYFLOAT(累加)、GET(查询)
|
|
|
- Suffix 规则:重置时间去掉冒号(HH:mm → HHmm)
|
|
|
@@ -239,6 +241,7 @@ src/
|
|
|
**为什么需要 Suffix?**
|
|
|
|
|
|
不同用户可能配置不同的重置时间:
|
|
|
+
|
|
|
- 用户 A 配置 18:00 重置 → `key:1:cost_daily_1800`
|
|
|
- 用户 B 配置 00:00 重置 → `key:2:cost_daily_0000`
|
|
|
|
|
|
@@ -255,6 +258,7 @@ src/
|
|
|
```
|
|
|
|
|
|
**特性**:
|
|
|
+
|
|
|
- Redis 类型:ZSET(Sorted Set)
|
|
|
- 操作命令:Lua 脚本(ZADD + ZREMRANGEBYSCORE + ZRANGE)
|
|
|
- Suffix 规则:固定使用 `rolling`,无时间后缀
|
|
|
@@ -264,6 +268,7 @@ src/
|
|
|
**为什么不需要 Suffix?**
|
|
|
|
|
|
滚动窗口没有固定的重置时间点:
|
|
|
+
|
|
|
- 每次查询都是"当前时间往前推 24 小时"
|
|
|
- 所有用户使用相同的窗口计算逻辑
|
|
|
- TTL 固定为 24 小时,无需区分重置时间
|
|
|
@@ -286,12 +291,12 @@ src/
|
|
|
|
|
|
#### 数据结构对比
|
|
|
|
|
|
-| 模式 | Redis 类型 | 命名示例 | TTL 策略 | 时间精度 | 操作复杂度 |
|
|
|
-|----------|------------|----------------------------|-------------------|----------|------------|
|
|
|
-| 固定窗口 | STRING | `cost_daily_1800` | 动态(到重置时间) | 分钟级 | 简单 |
|
|
|
-| 滚动窗口 | ZSET | `cost_daily_rolling` | 固定(24h) | 毫秒级 | 中等 |
|
|
|
-| 5h 滚动 | ZSET | `cost_5h_rolling` | 固定(5h) | 毫秒级 | 中等 |
|
|
|
-| 周/月 | STRING | `cost_weekly`/`cost_monthly` | 动态(到下周期) | 分钟级 | 简单 |
|
|
|
+| 模式 | Redis 类型 | 命名示例 | TTL 策略 | 时间精度 | 操作复杂度 |
|
|
|
+| -------- | ---------- | ---------------------------- | ------------------ | -------- | ---------- |
|
|
|
+| 固定窗口 | STRING | `cost_daily_1800` | 动态(到重置时间) | 分钟级 | 简单 |
|
|
|
+| 滚动窗口 | ZSET | `cost_daily_rolling` | 固定(24h) | 毫秒级 | 中等 |
|
|
|
+| 5h 滚动 | ZSET | `cost_5h_rolling` | 固定(5h) | 毫秒级 | 中等 |
|
|
|
+| 周/月 | STRING | `cost_weekly`/`cost_monthly` | 动态(到下周期) | 分钟级 | 简单 |
|
|
|
|
|
|
#### 实现细节
|
|
|
|
|
|
@@ -322,6 +327,7 @@ const current = await redis.eval(GET_COST_DAILY_ROLLING_WINDOW, 1, key, now, win
|
|
|
```
|
|
|
|
|
|
**Lua 脚本优势**:
|
|
|
+
|
|
|
- 原子性:查询、清理过期数据、累加在一个操作内完成
|
|
|
- 精确性:基于毫秒级时间戳,避免边界问题
|
|
|
- 性能:减少网络往返次数
|