redis如何限流
- 编程技术
- 2025-02-19 05:54:01
- 1

Redis限流是一种常见的用于防止系统过载的保护措施。以下是一些使用Redis实现限流的方法: 1. 使用Redis的SET命令使用Redis的SET命令可以限制某个用...
Redis限流是一种常见的用于防止系统过载的保护措施。以下是一些使用Redis实现限流的方法:
1. 使用Redis的SET命令
使用Redis的SET命令可以限制某个用户或IP在单位时间内访问服务的次数。
```bash
SET key value EX seconds [NXXX] [GET]
```
`key`:唯一标识用户的键。
`value`:计数器的值。
`EX`:键的过期时间。
`NX`:只在键不存在时设置键。
`XX`:只在键存在时设置键。
`GET`:获取当前键的值。
例如,限制一个IP在1分钟内只能访问10次:
```bash
SET ip:limit:1 EX 60 NX
```
每次请求时,检查并增加计数器:
```bash
INCR ip:limit:1
```
如果计数器超过10,则拒绝请求。
2. 使用Redis的ZADD命令
使用Redis的ZADD命令可以记录每个用户的请求时间戳,然后根据时间戳进行限流。
```bash
ZADD key score member [score member ...]
```
`key`:存储时间戳的键。
`score`:时间戳。
`member`:用户的唯一标识。
例如,限制一个IP在1分钟内只能访问10次:
```bash
ZADD ip:timestamps 1 $timestamp $ip
```
每次请求时,检查时间戳:
```bash
ZRANGEBYSCORE ip:timestamps 0 $timestamp +inf LIMIT 0 9
```
如果结果集的大小大于9,则拒绝请求。
3. 使用Redis的Sorted Set和Lua脚本
结合Sorted Set和Lua脚本,可以更精确地控制限流逻辑。
```lua
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local timestamp = tonumber(ARGV[2])
local current = redis.call('ZCARD', key)
if current < limit then
redis.call('ZADD', key, timestamp, ARGV[3])
return 1
else
return 0
end
```
使用Lua脚本执行限流逻辑:
```bash
EVAL 桂ICP备2023005595号-11