redis+celery统计django项目中接口的调用次数
需求:统计django项目中接口的调用次数
思路:中间件+异步任务celery+缓存redis
具体思路:
- 定义中间件,在中间件中响应走的时候判断该请求的url是否存在【status_code != 404】,存在则统计, 否则不统计。
- 中间件中调用异步任务,异步任务用celery实现。
- 异步任务做的事情就是在缓存中放一个字典,字典的key是访问的接口url,字典的值是该接口访问的次数。
- 缓存使用redis,在django项目中使用
django-redis
模块,替换django默认的缓存方式。
效果图
代码实现
- 缓存配置
# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache", # 使用django-redis的缓存
"LOCATION": "redis://127.0.0.1:6379/0", # redis数据库的位置
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES": True, # 自动将byte转成字符串
"PASSWORD": "", # 设置密码
}
}
}
- 定义中间件
from django.utils.deprecation import MiddlewareMixin
from celery_task.tasks import get_api_throttling
# 统计接口访问次数的中间件
class APIThrottlingMiddleware(MiddlewareMixin):
def process_response(self, request, response):
if response.status_code != 404: # 只统计存在的接口
this_url = request.path
get_api_throttling.delay(this_url) # 响应走的时候调用异步任务,更新接口调用次数
return response
- 实现celery异步任务【包管理的方式】
# celery_task/tasks.py
from .celery import app
from Luffyapi.utils.get_redis_obj import conn
# 使用django-redis.get_redis_connection的方式操作原生的redis
@app.task
def get_api_throttling(url):
# cache_api_throttling_info_hash是一个hash结构,url作为key; url存在则加1,不存在则新增一个默认值=1
conn.hincrby('cache_api_throttling_info_hash', url, amount=1)
return True
- 通过命令开启celery的worker即可
# linux/mac
celery worker -A celery_task -l info # celery_task是包名
# windows:
windows上如果通过上述命令启动失败或者后期执行任务失败则借助eventlet模块启动
pip3 install eventlet
celery worker -A celery_task -l info -P eventlet