如何查看django-ratelimit在Redis服务器中存储的限流相关key?
配置正确性说明
你的基础配置逻辑是正常的,限流功能可正常运行就证明核心流程没有问题,查询不到缓存key是查询方式和key命名规则不匹配导致的。
找不到缓存key的两个核心原因
- 你查询的Redis库不匹配:你Django配置中指定使用1号Redis库(
LOCATION配置后缀为/1),但redis-cli默认连接的是0号库,查询前需要先切换库,执行命令:select 1 - 你搜索的key名称错误:django-ratelimit不会存储名为
ip的key,实际存储的key由多段拼接生成:- Django全局缓存前缀:你配置的
KEY_PREFIX: "my_app" - Django缓存版本号:默认值为
1 - django-ratelimit固定前缀:
rl: - 限流维度值:这里是实际请求的客户端IP,不是
ip字符串 - 限流周期分片时间戳:用来统计对应时间窗口内的请求数
最终完整key格式示例:my_app:1:rl:127.0.0.1:1718000000
- Django全局缓存前缀:你配置的
缓存查询验证方法
Redis直接查询
127.0.0.1:6379> select 1 OK 127.0.0.1:6379> keys *rl* 1) "my_app:1:rl:127.0.0.1:1718000000"
Django Shell查询
Django的缓存接口会自动处理前缀拼接,直接搜索ratelimit特征前缀即可:
>>> from django.core.cache import cache >>> cache.keys("*rl*") ['rl:127.0.0.1:1718000000']
生产环境适配建议
你的现有配置只要补充以下调整即可用于生产:
- 在settings.py中显式添加配置
RATELIMIT_USE_CACHE = 'default',避免依赖默认值导致后续版本升级出现异常 - 如果你只需要限制POST请求,将装饰器的
method参数修改为['POST']即可,当前配置会同时限制GET和POST请求 - 确认限流拦截逻辑:
django-ratelimit默认block=False,仅会给请求对象添加request.limited标记,不会主动拦截请求,如果你需要自动返回429响应,可以在装饰器中添加block=True参数,或者全局配置RATELIMIT_BLOCK = True
内容的提问来源于stack exchange,提问作者BK0090
相关产品推荐
相关产品推荐

