django缓存信号高并发问题
django缓存进阶
网站设计制作、成都网站建设,成都做网站公司-创新互联公司已向1000+企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。
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_letters
char = random.choice(chrs)
return HttpResponse('用户列表页面:
%s' % char)
2,添加中间件进行缓存,创建缓存中间件,每次有请求前先判断
class CachePageMiddleware(MiddlewareMixin):
配置缓存的页面路径
cache_page_path = [
'/user/list/'
]
# 实现process_request和process_response来判断缓存,request.path
def 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后不支持多进程方式执行需要该换成协程方式
在主目录创建celery
from futureimport 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)'
在settings中,配置celery项
CELERY_IMPORTS = ('stockapp.tasks',)
启动celery
celery -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
本文题目:django缓存信号高并发问题
文章网址:http://azwzsj.com/article/gseppd.html