django缓存信号高并发问题
django缓存进阶
django六种缓存策略
开发调试内存文件数据库Memcache缓存(python-memcached模块)Memcache缓存(pylibmc模块)
缓存页面
1,@cache_page方法缓存
添加@cache_page装饰器缓存参数缓存时间,缓存方案,以及前缀@cache_page(timeout=10,cache='html',key_prefix='page')
def list(request):
chrs = string.ascii_letterschar = random.choice(chrs)return HttpResponse('用户列表页面: <br> %s' % char)
2,添加中间件进行缓存,创建缓存中间件,每次有请求前先判断
class CachePageMiddleware(MiddlewareMixin):
配置缓存的页面路径cache_page_path = [ '/user/list/']# 实现process_request和process_response来判断缓存,request.pathdef process_request(self, request): # 判断当前的请求是否支持缓存 if request.path in self.cache_page_path: # 判断页面是否已缓存 if cache.has_key(request.path): return HttpResponse(cache.get(request.path))def process_response(self, request, response): # 判断当前请求路径是否要被缓存 if request.path in self.cache_page_path: # 设置响应内容为缓存的内容,请求路径,响应,超时 cache.set(request.path, response.content, timeout=5) return response
用redis进行的缓存
在settings中配置缓存项CACHES = {
# 设置默认缓存'default': { # 缓存的方法,django-radis.cache.RedisCache 'BACKEND': 'django_redis.cache.RedisCache', # 设置缓存的路径 'LOCATION': 'redis://127.0.0.1:6379/10', # 设置缓存的路径,用户类型,连接超时, 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'SOCKET_CONNECT_TIMEOUT': 10, 'SOCKET_TIMEOUT': 10 }}
}
用session设置缓存
缓存引擎SESSION_ENGINE='django.contrib.session.backends.cache'
缓存cookie名字SESSION_COOKIE_NAME='SESSION_ID'
缓存路径SESSION_COOKIE_PATH='/'
SESSION_CACHE_ALIAS='default'
缓存生存周期SESSION_COOKIE_AGE='1209600'
信号机制
监控django的内部事件
复杂业务解耦
接收内置的信号
先设置普通的接收信号,使用信号的connect()函数
from django.db.models.signals impoer pre_delete
def model_delete_pre(sender,**kwargs):
from user.models import Order
if sender == Order: print('')
pre_delete.connect(model_delete_pre)
使用装饰器方式接收信号和连接信息处理函数from django.dispatch import receiver
@receiver(post_delete)
def delete_model_post(sender,**kwargs):
print(sender,kwargs)
pre_delete.connect(delete_model_post)
自定义信号创建signals包,并在init中声明
from django import dispatch
codeSignal = dispatch.Signal(providing_args=['path','phone','code'])
发送信息根据业务需求,在适当位置发送信息
def new_code(request):
# 生成手机验证码# 随机产生验证码,code_text = code_new_code_str(4)print(code_text)phone = request.GET.get('phone')print(phone)# 将信号发送出去signal.codeSignal.send('new_code', path = 'request.path', phone = phone, code = code_text)return HttpResponse('%s...' % phone)
接收信号
from signals import codeSignal
from django import dispatch
@dispatch.receiver(codeSignal)
def cache_code(sender,**kwargs):
print('...')
print(sender,kwargs)
HttpResponse的子类
JsonResponse
HttpResponseRedirect
HttpresopnseNotAllow
HttpResponseGone
django中间件相关函数
process_request()
process_response()
process_view()
process_exception()
process_template_response()
分页器属性
bumber
object_list
has_previous
has_next
previous_page_number
next_page_number
高并发解决方案
使用celery+redis队列
celery解决c10k问题,通过中间件和后台任务执行单元解决高并发问题
celery组成部分
消息中间件broker
任务执行单元worker
存储任务执行单元存储result
配置
相关文档: http://docs.celeryproject.org/en/latest/django/index.html
win在celery后不支持多进程方式执行需要该换成协程方式
在主目录创建celeryfrom future import absolute_import ,unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE','advicedjango.settings')
app = Celery('advicedjango',
broker='redis://10.36.174.1:6379/8')
app.config_from_object('django.conf.settings')
app.autodiscover_tasks()
在主项目的init脚本添加all属性from .celery import app as celer_app
all = ('celery',)
在应用模块中,创建tesk任务模块from celery import shared_task
@shared_task
def qbuy(id,name):
print(id,name)
time.sleep(1)
return '%s,%s % (id,name)'
CELERY_IMPORTS = ('stockapp.tasks',)
启动celerycelery -A advicedjango worker -P gevent -I info
-A 指定项目,-P 指定协程 -I 指定信息
qbuy('1991',3)
Celery服务接收任务,并执行,可以看到执行的结果,
但是结果发出的警告。因为没有处理执行单元完成任务的结果。
pip3 install django-celery-results
在settings中配置result方案
添加'django_celery_result'添加CELERY_RESULT_BACKEND = 'django-db', django-cache进行新馆库的迁移
python manage.py migrate django_celery_results
迁移成功后重新启动Celery
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。