1. 程式人生 > >快取、序列化、訊號 快取、序列化、訊號

快取、序列化、訊號 快取、序列化、訊號

快取、序列化、訊號

 

目錄

回到頂部

一、快取

由於Django是動態網站,所有每次請求均會去資料進行相應的操作,當程式訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:快取,快取將一個某個views的返回值儲存至記憶體或者memcache中,5分鐘內再有人來訪問時,則不再去執行view中的操作,而是直接從記憶體或者memcache中之前快取的內容拿到,並返回。

Django中提供了6種快取方式:

  • 開發除錯
  • 記憶體
  • 檔案
  • 資料庫
  • Memcache快取(python-memcached模組)
  • Memcache快取(pylibmc模組)

1、配置

a、開發除錯

    # 此為開始除錯用,實際內部不做任何操作
    # 配置:
        CACHES = {
            
'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 快取超時時間(預設300,None表示永不過期,0表示立即過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, #
最大快取個數(預設300) 'CULL_FREQUENCY': 3, # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3) }, 'KEY_PREFIX': '', # 快取key的字首(預設空) 'VERSION': 1, # 快取key的版本(預設1) 'KEY_FUNCTION' 函式名 # 生成key的函式(預設函式會生成為:【字首:版本:key】) } } # 自定義key def default_key_func(key, key_prefix, version): """ Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix'. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. """ return '%s:%s:%s' % (key_prefix, version, key) def get_key_func(key_func): """ Function to decide which key function to use. Defaults to ``default_key_func``. """ if key_func is not None: if callable(key_func): return key_func else: return import_string(key_func) return default_key_func
View Code

b、記憶體

    # 此快取將內容儲存至記憶體的變數中
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                'LOCATION': 'unique-snowflake',
            }
        }

    # 注:其他配置同開發除錯版本
View Code

c、檔案

    # 此快取將內容儲存至檔案
    # 配置:

        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
            }
        }
    # 注:其他配置同開發除錯版本
View Code

d、資料庫

    # 此快取將內容儲存至資料庫

    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
                'LOCATION': 'my_cache_table', # 資料庫表
            }
        }

    # 注:執行建立表命令 python manage.py createcachetable
View Code

e、Memcache快取(python-memcached模組)

# 此快取使用python-memcached模組連線memcache

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': 'unix:/tmp/memcached.sock',
        }
    }   

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }
View Code

f、Memcache快取(pylibmc模組)

    # 此快取使用pylibmc模組連線memcache
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '/tmp/memcached.sock',
        }
    }   

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }
View Code

2、應用

a. 全站使用

   使用中介軟體,經過一系列的認證等操作,如果內容在快取中存在,則使用FetchFromCacheMiddleware獲取內容並返回給使用者,當返回給使用者之前,判斷快取中是否已經存在,如果不存在則UpdateCacheMiddleware會將快取儲存至快取,從而實現全站快取

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 其他中介軟體...
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]

    CACHE_MIDDLEWARE_ALIAS = ""
    CACHE_MIDDLEWARE_SECONDS = ""
    CACHE_MIDDLEWARE_KEY_PREFIX = ""
View Code

b. 單獨檢視快取

    方式一:
        from django.views.decorators.cache import cache_page

        @cache_page(60 * 15)
        def my_view(request):
            ...

    方式二:
        from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
        ]
View Code

c、區域性模板使用

    a. 引入TemplateTag

        {% load cache %}

    b. 使用快取

        {% cache 5000 快取key %}
            快取內容
        {% endcache %}
View Code

更多:猛擊這裡

回到頂部

二、序列化

關於Django中的序列化主要應用在將資料庫中檢索的資料返回給客戶端使用者,特別的Ajax請求一般返回的為Json格式。

1、serializers

?
1 2 3 4 5 from django.core import serializers   ret = models.BookType.objects. all ()   data = serializers.serialize( "json" , ret)

2、json.dumps

?
1 2 3 4 5 6 7 8 import json   #ret = models.BookType.objects.all().values('caption') ret = models.BookType.objects. all ().values_list( 'caption' )   ret = list (ret)   result = json.dumps(ret)

由於json.dumps時無法處理datetime日期,所以可以通過自定義處理器來做擴充套件,如:

+ View Code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import json  from datetime import date  from datetime import datetime      class JsonCustomEncoder(json.JSONEncoder):            def default( self , field):                 if isinstance (field, datetime):               return o.strftime( '%Y-%m-%d %H:%M:%S'          elif isinstance (field, date):               return o.strftime( '%Y-%m-%d'          else              return json.JSONEncoder.default( self , field)          # ds = json.dumps(d, cls=JsonCustomEncoder) 
回到頂部

 三、訊號

Django中提供了“訊號排程”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,訊號允許特定的傳送者去提醒一些接受者。

1、Django內建訊號

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Model signals      pre_init                    # django的modal執行其構造方法前,自動觸發      post_init                   # django的modal執行其構造方法後,自動觸發      pre_save                    # django的modal物件儲存前,自動觸發      post_save                   # django的modal物件儲存後,自動觸發      pre_delete                  # django的modal物件刪除前,自動觸發      post_delete                 # django的modal物件刪除後,自動觸發      m2m_changed                 # django的modal中使用m2m欄位操作第三張表(add,remove,clear)前後,自動觸發      class_prepared              # 程式啟動時,檢測已註冊的app中modal類,對於每一個類,自動觸發 Management signals      pre_migrate                 # 執行migrate命令前,自動觸發      post_migrate                # 執行migrate命令後,自動觸發 Request / response signals      request_started             # 請求到來前,自動觸發      request_finished            # 請求結束後,自動觸發      got_request_exception       # 請求異常後,自動觸發 Test signals      setting_changed             # 使用test測試修改配置檔案時,自動觸發      template_rendered           # 使用test測試渲染模板時,自動觸發 Database Wrappers      connection_created          # 建立資料庫連線時,自動觸發

對於Django內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,自動觸發註冊函式:

註冊訊號,寫入與project同名的資料夾下的_init_.py檔案中,也是換資料庫引擎的地方。

    from django.core.signals import request_finished
    from django.core.signals import request_started
    from django.core.signals import got_request_exception

    from django.db.models.signals import class_prepared
    from django.db.models.signals import pre_init, post_init
    from django.db.models.signals import pre_save, post_save
    from django.db.models.signals import pre_delete, post_delete
    from django.db.models.signals import m2m_changed
    from django.db.models.signals import pre_migrate, post_migrate

    from django.test.signals import setting_changed
    from django.test.signals import template_rendered

    from django.db.backends.signals import connection_created


    def callback(sender, **kwargs):
        print("xxoo_callback")
        print(sender,kwargs)

    xxoo.connect(callback)
    # xxoo指上述匯入的內容
View Code
def my_callback(sender, **kwargs):
    print("Request finished!")

# 方法一:
from django.core.signals import request_finished

request_finished.connect(my_callback)

# 方法二:
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")
示例
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel


@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
    ...
指定傳送者

2、自定義訊號

a. 定義訊號

在某py檔案中定義訊號。

?
1 2 import django.dispatch pizza_done = django.dispatch.Signal(providing_args = [ "toppings" , "size" ])

b. 註冊訊號

在_init_.py 中註冊訊號

?
1 2 3 4 5 def callback(sender, * * kwargs):      print ( "callback" )      print (sender,kwargs)   pizza_done.connect(callback)

c. 觸發訊號

?
1 2 3 from 路徑 import pizza_done   pizza_done.send(sender = 'seven' ,toppings = 123 , size = 456 )

由於內建訊號的觸發者已經整合到Django中,所以其會自動呼叫,而對於自定義訊號則需要開發者在任意位置觸發。

更多:猛擊這裡

 

目錄

回到頂部

一、快取

由於Django是動態網站,所有每次請求均會去資料進行相應的操作,當程式訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:快取,快取將一個某個views的返回值儲存至記憶體或者memcache中,5分鐘內再有人來訪問時,則不再去執行view中的操作,而是直接從記憶體或者memcache中之前快取的內容拿到,並返回。

Django中提供了6種快取方式:

  • 開發除錯
  • 記憶體
  • 檔案
  • 資料庫
  • Memcache快取(python-memcached模組)
  • Memcache快取(pylibmc模組)

1、配置

a、開發除錯

    # 此為開始除錯用,實際內部不做任何操作
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎
                'TIMEOUT': 300,                                               # 快取超時時間(預設300,None表示永不過期,0表示立即過期)
                'OPTIONS':{
                    'MAX_ENTRIES': 300,                                       # 最大快取個數(預設300)
                    'CULL_FREQUENCY': 3,                                      # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
                },
                'KEY_PREFIX': '',                                             # 快取key的字首(預設空)
                'VERSION': 1,                                                 # 快取key的版本(預設1)
                'KEY_FUNCTION' 函式名                                          # 生成key的函式(預設函式會生成為:【字首:版本:key】)
            }
        }


    # 自定義key
    def default_key_func(key, key_prefix, version):
        """
        Default function to generate keys.

        Constructs the key used by all other methods. By default it prepends
        the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
        function with custom key making behavior.
        """
        return '%s:%s:%s' % (key_prefix, version, key)

    def get_key_func(key_func):
        """
        Function to decide which key function to use.

        Defaults to ``default_key_func``.
        """
        if key_func is not None:
            if callable(key_func):
                return key_func
            else:
                return import_string(key_func)
        return default_key_func
View Code

b、記憶體

    # 此快取將內容儲存至記憶體的變數中
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                'LOCATION': 'unique-snowflake',
            }
        }

    # 注:其他配置同開發除錯版本
View Code

c、檔案

    # 此快取將內容儲存至檔案
    # 配置:

        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
            }
        }
    # 注:其他配置同開發除錯版本
View Code

d、資料庫

    # 此快取將內容儲存至資料庫

    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
                'LOCATION': 'my_cache_table', # 資料庫表
            }
        }

    # 注:執行建立表命令 python manage.py createcachetable
View Code

e、Memcache快取(python-memcached模組)

相關推薦

快取序列訊號 快取序列訊號

快取、序列化、訊號   目錄 一、快取

【Spring Boot】(24)Spring Boot中使用快取之Spring快取

1、快取依賴 只要新增如下依賴,即可使用快取功能。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

基於JVM原理JMM模型和CPU快取模型深入理解Java併發程式設計

許多以Java多執行緒開發為主題的技術書籍,都會把對Java虛擬機器和Java記憶體模型的講解,作為講授Java併發程式設計開發的主要內容,有的還深入到計算機系統的記憶體、CPU、快取等予以說明。實際上,在實際的Java開發工作中,僅僅瞭解併發程式設計的建立、啟動、管理和通訊等基本知識還是不夠的。一

定義序列器之關聯屬性(一對多多對多)

定義序列化器,通常是拿模型類的程式碼過來修改一下。但是如果遇到有關聯屬性的時候,應該怎麼寫呢? 假設有兩個模型類,一個是員工,一個是部門。部門與員工是一對多關係。那麼在定義序列器的時候怎麼寫關聯屬性的語句呢? 先把沒有涉及關聯屬性的欄位寫成序列化器: from rest_framework imp

java IO 位元組流字元流操作總結三之字元流序列和反序列

這一篇我講介紹一下字元流。什麼是字元流,就是若干個位元組組成一個字元。(為什麼說是若干個,不能確定嗎)這裡就來說說原因和編碼問題。 首先說說字元編碼的問題,比較常用的編碼有gbk,utf-8等。 a、.編碼問題(看前面所描述的)。 1、gbk 編碼中文佔用2個位元組,英文

Android高效載入大圖多圖和LruCache快取

高效載入大圖 我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統圖片庫裡展示的圖片大都是用手機攝像頭拍出來的,這些圖片的解析度會比我們手機螢幕的解析

Android:android的框架區別(網路框架圖片非同步載入與快取框架資料框架)特點整理

在我們安卓開發中,很多繁瑣的程式碼會很頭疼,編寫程式的週期會增加,因此很多框架都冒出來了,我們在搞懂底層原理之時,我們更應該學會用一些優秀框架來解決複雜程式碼,和繁瑣的重寫程式碼。因為針對最簡單的case,我只需要提供request url,成功時的callba

快取cpu偽共享和快取行填充

由於在看disruptor時瞭解到快取行,以及快取行填充的問題,所以各處瞭解記在這裡 一、快取行 CPU 為了更快的執行程式碼。於是當從記憶體中讀取資料時,並不是只讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 CPU ,快取記憶體

TCP流量控制中的滑動視窗大小TCP欄位中16位視窗大小MTUMSS快取區大小有什麼關係

本文將涉及到IP、TCP、Socket纏綿悱惻的愛情故事,如果您依然相信愛情,請耐心地看下去… MTU: Maximum Transmit Unit,最大傳輸單元,即物理介面(資料鏈路層)提供給其上層(通常是IP層)最大一次傳輸資料的大小;以普遍使用的乙太網介面為例,預

物件序列——java原生序列Kryo序列效能比較和Hessian序列

什麼是序列化以特定的方式對類例項的瞬時狀態進行編碼儲存的一種操作,叫做物件序列化。就是將物件的這個時刻的各種屬性各種值按照一定的規則變成二進位制流,然後如果傳輸到別的jvm中,jvm可以按照規則在將二進位制流反序列化成對應的物件,並且物件裡面還有當時的資料和各種屬性。序列化的

Redis快取維護方案-考慮資料庫與快取雙寫redis和本地資料庫事務一致性資料庫主從同步延遲的情況怎麼解決快取與資料庫不一致

一般常用的快取方案有兩種: 第一種 讀的時候,先讀快取,快取沒有的話,讀資料庫,取出資料後放入快取,同時返回響應。 更新的時候,

Mybatis的二級快取使用Redis做二級快取

[Toc] ## 什麼是二級快取? > 二級快取和一級快取的原理是一樣的,第一次查詢,會將資料放入快取中,然後第二次查詢則會直接去快取中取。但是一級快取是基於的**sqlSession**,而二級快取是基於**mapper檔案的namespace**的,也就是說**多個sqlSession**可以**共享*

學習筆記TF020:序列標註手寫小寫字母OCR數據集雙向RNN

step session 兩個 手寫體 line 調整 seq cal 預測 序列標註(sequence labelling),輸入序列每一幀預測一個類別。OCR(Optical Character Recognition 光學字符識別)。 MIT口語系統研究組Rob Ka

機器學習 之 SVM VC維度樣本數目與經驗風險最小的關系

能力 pan dsm 過擬合 引入 div 不但 機器 con VC維在有限的訓練樣本情況下,當樣本數 n 固定時。此時學習機器的 VC 維越高學習機器的復雜性越高。VC 維反映了函數集的學習能力,VC 維越大則學習機器越復雜(容量越大)。

41和為S的連續正數序列

clas color pre int 循環 ddl 正數 兩個 big 一、題目 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就

NOIP2016提高組初賽(2)四讀程序寫結果3求最長回文子序列

所有 並且 names mes font esp mic abcd 大小 #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2;

斯坦福大學公開課機器學習: advice for applying machine learning | regularization and bais/variance(機器學習中方差和偏差如何相互影響以及和算法的正則之間的相互關系)

交叉 來講 相對 同時 test 如果 開始 遞增 相互 算法正則化可以有效地防止過擬合, 但正則化跟算法的偏差和方差又有什麽關系呢?下面主要討論一下方差和偏差兩者之間是如何相互影響的、以及和算法的正則化之間的相互關系 假如我們要對高階的多項式進行擬合,為了防止過擬合現象

類繼承接口使用接口實例 與 使用類實例

允許 strong vmw comment cat 地址 order 類繼承 www. 一、 接口不能實例化,用接口的實現類可以實例化,將實現類的對象在內存中的地址指向接口,這個接口就可以使用了 二、 實現接口的類 實例 = new 實現接口的類()// 這樣用不好嗎?

【C++ STL】容器之序列式容器

一、Vector (1)將元素置於一個動態陣列中加以管理。 (2)可以隨機存取元素(用索引位元組存取) (3)陣列尾部新增或移除元素非常快速。當在頭部或中部安插元素比較費時。 【示例】 1 #include <iostream> 2 #include <vector>

Python視覺中Matplotlib繪圖(2.設定範圍標籤標題圖例(詳細引數))

1.為繪製的圖新增範圍 import matplotlib.pyplot as plt # 匯入繪圖模組 import numpy as np # 匯入需要生成資料的numpy模組 '''新增範圍''' y = np.arange(0,10,1) plt.plo