- 項目的架構(業(yè)務架構、技術架構、物理架構)
單機架構 ---> 多機架構 ---> 讀寫分離 ---> 集群架構
垂直擴展和水平擴展
Django工作流 / M(數據持久化)-V(頁面/報表/圖表)-C(接納請求/操作模型/生成視圖)
Django模型操作 - ORM - 正向反向工程
Model - save() / delete()
Model.objects - get() / filter() / all()
ForeignKey - related_name='+'
Dept.objects.get(no=20).emp_set.all() - 不推薦
Emp.objects.filter(dept__no=20) - 推薦
only() / defer() - 指定查詢哪些屬性(SQL投影)
解決1+N查詢問題(多個select變成一個select)
select_related() - 多對一關系 / 一對一關系
prefetch_related() - 多對多關系
params = []
params.append(Q(price__gte=2000))
params.append(Q(price__lte=3000))
params.append(Q(type=3))
House.objects.filter(*params)
什么時候需要事務環(huán)境 - 一個用戶請求涉及到多個持久化操作
而且這些操作不可分割 這時候就需要事務環(huán)境的支持
當有并發(fā)事務訪問數據庫的數據時就有可能產生5類問題:
- 第1類丟失更新
- 第2類丟失更新
- 臟讀(讀臟數據) - read committed 可以避免臟讀 - Oracle
- 可不重復讀 - repeatable read 可以避免不可重復讀 - MySQL
- 幻讀 - serializable
事務隔離級別越高數據越安全但是并發(fā)性也越低(性能越差)
數據庫底層可以通過鎖來保護數據避免并發(fā)訪問數據的問題
但是如果在寫SQL時直接使用鎖操作會非常麻煩(行級鎖、表級鎖、共享鎖、排他鎖),所以可以根據業(yè)務的需求設置適當的事務隔離級別讓數據庫自動選擇加鎖的方式
MySQL查看事務隔離級別:
select @@tx_isolation;
MySQL修改當前會話的事務隔離級別:
set session transaction isolation level read committed;
MySQL修改全局的事務隔離級別:
set global transaction isolation level read committed;
read uncommitted - 讀未提交
read committed - 讀提交
repeatable read - 可重復讀
serializable - 串行化
日志 - 系統(tǒng)內日志 / 運行日志(Nginx,uWSGI)
給視圖函數添加事務環(huán)境的兩種方式:
@transaction.atomic()
with transaction.atomic():
pass
自己處理不了的業(yè)務 - 外包出去 / 通過其他平臺完成 - 業(yè)務下沉
- 調用數據接口(http/https) - urllib / requests / responses
- 集成SDK - pip install 三方庫 - 對象方法、函數
短信平臺 - SendCloud / luosimao / 又拍云 / 云片 / 互億無線 / 阿里云(?)/
中間件的寫法 - 3種
靜態(tài)資源存儲 - 云存儲(視頻編解碼/圖片水印/縮略圖/CDN) - 七牛 / LeanCloud / Bmob / OSS
緩存配置 - Redis - django-redis
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': [],
'KEY_PREFIX': '...',
'OPTIONS': {},
}
}
在Django項目中使用緩存
- 存儲用戶會話 - session
- 緩存頁面
- 緩存熱點數據
- 緩存手機驗證碼
- 緩存查詢結果
- 點贊 / 排行榜 / 秒殺
cache.set() / cache.get()
caches['code'].set() / get()
django-redis:
get_redis_connection() --> StrictRedis(Redis客戶端對象)
client = get_redis_connection()
client.hvals('...')