Redis 数据库 限流算法对比实战

Redis 数据库阿木 发布于 2025-07-11 11 次阅读


Redis限流算法对比实战

随着互联网的快速发展,高并发、高可用、高性能的系统设计成为了开发者的核心挑战之一。在众多挑战中,限流算法是保证系统稳定运行的关键技术之一。Redis作为一款高性能的键值存储数据库,在限流场景中有着广泛的应用。本文将围绕Redis限流算法,对比几种常见的限流策略,并通过实战代码展示如何在Redis中实现这些算法。

1. 限流算法概述

限流算法的主要目的是控制系统中某个接口或资源的访问频率,防止恶意攻击或异常请求对系统造成过大压力。常见的限流算法包括:

1. 令牌桶算法(Token Bucket)

2. 漏桶算法(Leaky Bucket)

3. 固定窗口计数器(Fixed Window Counter)

4. 滑动窗口计数器(Sliding Window Counter)

2. 令牌桶算法

令牌桶算法是一种动态限流算法,它允许一定量的请求通过,同时限制请求的速率。算法的核心思想是维护一个令牌桶,以恒定的速率向桶中添加令牌,请求访问时需要从桶中取出令牌。

2.1 Redis实现

python

import redis


import time

连接Redis


client = redis.StrictRedis(host='localhost', port=6379, db=0)

设置令牌桶参数


bucket_size = 100 桶大小


tokens_per_second = 10 每秒产生令牌数


token_key = 'token_bucket'


limit_key = 'limit'

获取当前时间戳


current_time = int(time.time())

获取桶中剩余令牌数


remaining_tokens = client.hget(token_key, current_time) or 0

如果令牌不足,则返回错误


if remaining_tokens < 1:


return "Error: Too many requests"

添加新令牌


client.hincrby(token_key, current_time, 1)

检查是否超过限制


if client.hincrby(limit_key, current_time, 1) > bucket_size:


client.hdel(limit_key, current_time)

返回成功


return "Success"


3. 漏桶算法

漏桶算法是一种固定速率的限流算法,它允许一定速率的请求通过,但不会超过这个速率。

3.1 Redis实现

python

import redis


import time

连接Redis


client = redis.StrictRedis(host='localhost', port=6379, db=0)

设置漏桶参数


tokens_per_second = 10 每秒产生令牌数


token_key = 'token_bucket'


limit_key = 'limit'

获取当前时间戳


current_time = int(time.time())

获取桶中剩余令牌数


remaining_tokens = client.hget(token_key, current_time) or 0

如果令牌不足,则返回错误


if remaining_tokens < 1:


return "Error: Too many requests"

添加新令牌


client.hincrby(token_key, current_time, 1)

检查是否超过限制


if client.hincrby(limit_key, current_time, 1) > tokens_per_second:


client.hdel(limit_key, current_time)

返回成功


return "Success"


4. 固定窗口计数器

固定窗口计数器算法在固定的时间窗口内统计请求次数,超过限制则拒绝请求。

4.1 Redis实现

python

import redis


import time

连接Redis


client = redis.StrictRedis(host='localhost', port=6379, db=0)

设置固定窗口计数器参数


window_size = 60 时间窗口大小(秒)


max_requests = 100 最大请求次数


limit_key = 'limit'

获取当前时间戳


current_time = int(time.time())

获取当前时间窗口的请求次数


current_window = current_time // window_size


current_requests = client.hget(limit_key, current_window) or 0

如果请求次数超过限制,则返回错误


if current_requests >= max_requests:


return "Error: Too many requests"

更新请求次数


client.hincrby(limit_key, current_window, 1)

返回成功


return "Success"


5. 滑动窗口计数器

滑动窗口计数器算法在滑动的时间窗口内统计请求次数,超过限制则拒绝请求。

5.1 Redis实现

python

import redis


import time

连接Redis


client = redis.StrictRedis(host='localhost', port=6379, db=0)

设置滑动窗口计数器参数


window_size = 60 时间窗口大小(秒)


max_requests = 100 最大请求次数


limit_key = 'limit'

获取当前时间戳


current_time = int(time.time())

获取当前时间窗口的请求次数


current_window = current_time // window_size


current_requests = client.hget(limit_key, current_window) or 0

如果请求次数超过限制,则返回错误


if current_requests >= max_requests:


return "Error: Too many requests"

更新请求次数


client.hincrby(limit_key, current_window, 1)

清理旧窗口的请求次数


old_window = (current_window - 1) % window_size


client.hdel(limit_key, old_window)

返回成功


return "Success"


总结

本文对比了Redis中几种常见的限流算法,并通过实战代码展示了如何在Redis中实现这些算法。在实际应用中,开发者可以根据具体场景选择合适的限流算法,以保证系统的稳定运行。