用 INCR 做一个最简单的限流
INCR 原子地加 1 并返回新值;key 不存在时按 0 算。比「GET 出来加 1 再 SET 回去」安全:两个客户端不会都读到同一个旧值。
按分钟计数的限流:
INCR rl:user1:202610150420 # 返回 1,说明是这一分钟第一次
EXPIRE rl:user1:202610150420 60
INCR rl:user1:202610150420 # 2
INCR rl:user1:202610150420 # 3,超过阈值就拒绝只在返回 1 时设过期时间,后面的 INCR 不会改 TTL。
几个细节:值不是整数时 INCR 直接报错;类型还是 string;INCRBY、DECR、DECRBY 同理。
这种写法有个小缺口:INCR 成功、EXPIRE 之前崩了,key 就不会过期。要严格的话,把两步写进一段 Lua。