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
posted @ 2020-07-26 16:00  the3times  阅读(805)  评论(3编辑  收藏  举报