django缓存信号高并发问题
admin
2023-07-04 14:24:46
0

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('用户列表页面: 
%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

相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...