首页/数据/数据库速查/计数器场景:限流与库存扣减
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条
Redis 命令96 条
Redis 运维与场景124 条

计数器场景:限流与库存扣减

固定窗口限流=INCR + 首次设过期;库存扣减=DECR 后判断是否 <0 再回补;更精细的窗口用 Lua 或 Redis Cell 模块。

数据库速查数据更新于 2026-10-12

固定窗口限流(每分钟 60 次)

固定窗口限流(每分钟 60 次)
INCR rate:api:u1001:202610121030
EXPIRE rate:api:u1001:202610121030 60 NX   # NX:已设过期不重置
GET rate:api:u1001:202610121030              # 第 61 次触发限流
# 更稳写法(Lua 原子):
EVAL "local c=redis.call('INCR',KEYS[1]) if c==1 then redis.call('EXPIRE',KEYS[1],ARGV[1]) end return c" 1 rate:key 60

库存扣减

库存扣减
SET stock:sku88 100
DECR stock:sku88         # 99
# 扣到负数说明超卖,需要补偿
# 推荐 Lua 原子判断:
EVAL "local s=tonumber(redis.call('GET',KEYS[1]) or '0') if s<=0 then return -1 end return redis.call('DECR',KEYS[1])" 1 stock:sku88
先 GET 再 SET 的库存写法在并发下必超卖;判断与扣减必须在 Lua 或单命令里原子完成。

易错点

  • INCR 后用 EXPIRE 无条件重置:窗口被不断延长成「永不重置」的计数器
  • 固定窗口临界点双倍流量:59 秒与 61 秒各 60 次,需滑动窗口或令牌桶

数据来源与参考

  • Redis 官方文档: INCR
  • Redis 官方文档: EVAL
  • Redis 官方文档: 使用模式(限流)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌