dajngo cache,throttling
缓存
背景介绍:
动态网站的问题就在于它是动态的。 也就是说每次用户访问一个页面,服务器要执行数据库查询,启动模板,执行业务逻辑以及最终生成一个你所看到的网页,这一切都是动态即时生成的。 从处理器资源的角度来看,这是比较昂贵的。
缓存的目的是为了避免重复计算,特别是对一些比较耗时间、资源的计算。
django 自带的缓存:
内存缓存、数据库缓存、文件系统缓存、本地内存缓存、仿缓存,自定义后端缓存,本篇介绍redis+drf-extensions实现缓存。也可以自己通过装饰器和redis-py模块手动实现,较为简单。
settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 在view中使用
from django.shortcuts import render
from django.views.decorators.cache import cache_page @cache_page(60 * 15)
def my_view(request):
... # 在urlConf中使用cache
from django.views.decorators.cache import cache_page urlpatterns = [
path('/', cache_page(60 * 15)(IndexView.as_view())),
]
如下为restframework缓存配置
环境配置:
$ pip install django-redis
$ pip install drf-extensions
settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "mysecret"
}
}
}
views.py(装饰器更灵活)
from rest_framework_extensions.cache.decorators import (
cache_response
) class GoodsView(APIView):
@cache_response(timeout=60*60, cache='default')
def get(self,request,*args,**kwargs):
...
# or
@cache_response(timeout=60*60, cache='default')
def list(self,request,*args,**kwargs):
......
- timeout 缓存时间
- cache 缓存使用的Django缓存后端(即CACHES配置中的键名称)
限流
限流与权限类似,因为它确定是否应该授权请求。 限流阀指示临时状态,并用于控制客户端可以对API进行的请求速率。
与权限一样,可能会使用多种限流方式。你的 API 可能对未经身份验证的请求进行限流,对经过身份验证的请求限流较少。
如果你需要对 API 的不同部分使用不同的限流策略,由于某些服务特别占用资源,你可能想要使用同时有多种限流策略的另一种方案。
如果你想要同时实现爆发限流率和持续限流率,也可以使用多个限流阀。例如,你可能希望将用户限制为每分钟最多 60 个请求,并且每天最多 1000 个请求。
限流阀不一定只限制请求频率。例如,存储服务可能还需要对带宽进行限制,而付费数据服务可能希望对正在访问的某些记录进行限制。
限流算法:
1. 计数器算法
2. 漏桶算法
3. 令牌桶算法
restframework 自带 Throttling,也是利用了cache,统计ip,user请求次数
设置限流策略
settings.py全局设置默认限流策略
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '3/min',
'user': '5/min'
}
}
"""
('s', 'sec', 'm', 'min', 'h', 'hour', 'd', 'day')
"""
然后在视图类中加入即可
from rest_framework.throttling import AnonRateThrottle
from rest_framework.throttling import UserRateThrottle class DemoAPIView(APIView):
throttle_classes = (AnonRateThrottle,UserRateThrottle)
当然也可以自定义Throttle
class VipInstantRateThrottle(UserRateThrottle):
rate = '30/min' class VipContinuedRateThrottle(UserRateThrottle):
rate = '1000/day'
API参考
AnonRateThrottle
AnonRateThrottle 将永远限制未认证的用户。通过传入请求的 IP 地址生成一个唯一的密钥来进行限制。
允许的请求频率由以下之一决定(按优先顺序)。
1. 类的 rate 属性,可以通过继承 AnonRateThrottle 并设置属性来提供。
2. DEFAULT_THROTTLE_RATES['anon'] 设置.
如果你想限制未知来源的请求频率,AnonRateThrottle 是合适的。
UserRateThrottle
UserRateThrottle 通过 API 将用户请求限制为给定的请求频率。用户标识用于生成一个唯一的密钥来加以限制。未经身份验证的请求将回退到使用传入请求的 IP 地址生成一个唯一的密钥来进行限制。
允许的请求频率由以下之一决定(按优先顺序)。
1. 类的 rate 属性,可以通过继承 UserRateThrottle 并设置属性来提供。
2. DEFAULT_THROTTLE_RATES['user'] 设置.
一个 API 可能同时具有多个 UserRateThrottles。为此,请继承 UserRateThrottle 并为每个类设置一个唯一的“范围”。
dajngo cache,throttling的更多相关文章
- 45.限流Throttling及源码解析
什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...
- ABP源码分析十三:缓存Cache实现
ABP中有两种cache的实现方式:MemroyCache 和 RedisCache. 如下图,两者都继承至ICache接口(准确说是CacheBase抽象类).ABP核心模块封装了MemroyCac ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExecu ...
- HTML5离线缓存(Application Cache)
HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...
随机推荐
- Android 图片加载框架 Glide4.x
概述 Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片 Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply存在冲突的设置,会以最后一次为准 新增 ...
- delphi做的程序如何连接SQL数据库
1. 新建一个FORM.在控件栏找到ADO一栏,把里面的ADOConnection和ADOQuery两个各建立一个放在FORM里.这两个控件运行后是不可见的,所以你可以随便放在FORM的任何位置.然后 ...
- Asp.net mvc 项目返回Json
因mvc控制器返回类型JsonResult 在处理对象转JSON的时候,对日期的格式化处理并不太符合要求,所以重新继承抽象类ActionResult使用Newtonsoft.Json来系列化 usin ...
- Asp.Net Core 全局模型验证
public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...
- 【English】20190320
valid有效的 [ˈvælɪd] solitary独立的 [ˈsɑ:ləteri] data definition not valid unless solitary qualifying有资格的 ...
- (十五)The Search API
Now let’s start with some simple searches. There are two basic ways to run searches: one is by sendi ...
- C# 读写本地配置文件
1.在本地有一个如下配置文件 2.读写本地配置文件 3.对配置文件的内容进行操作
- 一文搞懂Raft算法
raft是工程上使用较为广泛的强一致性.去中心化.高可用的分布式协议.在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos.但Paxos是:少数真正理解的人觉得简单,尚未理解 ...
- 微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...
- flask(三)之Flask-SQLAlchemy
01-介绍 Flask-SQLAlchemy是一个Flask扩展,简化了在Flask应用中使用SQLAlchemy的操作.SQLAlchemy提供了高层ORM,也提供了使用数据库原生SQL的低层功能. ...