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_letters
char = random.choice(chrs)
return HttpResponse('用户列表页面: <br> %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 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)'

在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

猜你喜欢

转载自blog.51cto.com/14418623/2435616