- 項目的架構(gòu)(業(yè)務(wù)架構(gòu)、技術(shù)架構(gòu)、物理架構(gòu))
單機架構(gòu) ---> 多機架構(gòu) ---> 讀寫分離 ---> 集群架構(gòu)
垂直擴展和水平擴展
Django工作流 / M(數(shù)據(jù)持久化)-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() - 多對一關(guān)系 / 一對一關(guān)系
prefetch_related() - 多對多關(guān)系
params = []
params.append(Q(price__gte=2000))
params.append(Q(price__lte=3000))
params.append(Q(type=3))
House.objects.filter(*params)
什么時候需要事務(wù)環(huán)境 - 一個用戶請求涉及到多個持久化操作
而且這些操作不可分割 這時候就需要事務(wù)環(huán)境的支持
當(dāng)有并發(fā)事務(wù)訪問數(shù)據(jù)庫的數(shù)據(jù)時就有可能產(chǎn)生5類問題:
- 第1類丟失更新
- 第2類丟失更新
- 臟讀(讀臟數(shù)據(jù)) - read committed 可以避免臟讀 - Oracle
- 可不重復(fù)讀 - repeatable read 可以避免不可重復(fù)讀 - MySQL
- 幻讀 - serializable
事務(wù)隔離級別越高數(shù)據(jù)越安全但是并發(fā)性也越低(性能越差)
數(shù)據(jù)庫底層可以通過鎖來保護數(shù)據(jù)避免并發(fā)訪問數(shù)據(jù)的問題
但是如果在寫SQL時直接使用鎖操作會非常麻煩(行級鎖、表級鎖、共享鎖、排他鎖),所以可以根據(jù)業(yè)務(wù)的需求設(shè)置適當(dāng)?shù)氖聞?wù)隔離級別讓數(shù)據(jù)庫自動選擇加鎖的方式
MySQL查看事務(wù)隔離級別:
select @@tx_isolation;
MySQL修改當(dāng)前會話的事務(wù)隔離級別:
set session transaction isolation level read committed;
MySQL修改全局的事務(wù)隔離級別:
set global transaction isolation level read committed;
read uncommitted - 讀未提交
read committed - 讀提交
repeatable read - 可重復(fù)讀
serializable - 串行化
日志 - 系統(tǒng)內(nèi)日志 / 運行日志(Nginx,uWSGI)
給視圖函數(shù)添加事務(wù)環(huán)境的兩種方式:
@transaction.atomic()
with transaction.atomic():
pass
自己處理不了的業(yè)務(wù) - 外包出去 / 通過其他平臺完成 - 業(yè)務(wù)下沉
- 調(diào)用數(shù)據(jù)接口(http/https) - urllib / requests / responses
- 集成SDK - pip install 三方庫 - 對象方法、函數(shù)
短信平臺 - 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
- 緩存頁面
- 緩存熱點數(shù)據(jù)
- 緩存手機驗證碼
- 緩存查詢結(jié)果
- 點贊 / 排行榜 / 秒殺
cache.set() / cache.get()
caches['code'].set() / get()
django-redis:
get_redis_connection() --> StrictRedis(Redis客戶端對象)
client = get_redis_connection()
client.hvals('...')