數(shù)據(jù)庫事務(wù)、Redis緩存

  1. 項目的架構(gòu)(業(yè)務(wù)架構(gòu)、技術(shù)架構(gòu)、物理架構(gòu))

單機架構(gòu) ---> 多機架構(gòu) ---> 讀寫分離 ---> 集群架構(gòu)

垂直擴展和水平擴展

  1. Django工作流 / M(數(shù)據(jù)持久化)-V(頁面/報表/圖表)-C(接納請求/操作模型/生成視圖)

  2. 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. 第1類丟失更新
  2. 第2類丟失更新
  3. 臟讀(讀臟數(shù)據(jù)) - read committed 可以避免臟讀 - Oracle
  4. 可不重復(fù)讀 - repeatable read 可以避免不可重復(fù)讀 - MySQL
  5. 幻讀 - 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)境的兩種方式:

  1. @transaction.atomic()

  2. with transaction.atomic():
    pass

自己處理不了的業(yè)務(wù) - 外包出去 / 通過其他平臺完成 - 業(yè)務(wù)下沉

  1. 調(diào)用數(shù)據(jù)接口(http/https) - urllib / requests / responses
  2. 集成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項目中使用緩存

  1. 存儲用戶會話 - session
  2. 緩存頁面
  3. 緩存熱點數(shù)據(jù)
  4. 緩存手機驗證碼
  5. 緩存查詢結(jié)果
  6. 點贊 / 排行榜 / 秒殺

cache.set() / cache.get()
caches['code'].set() / get()

django-redis:
get_redis_connection() --> StrictRedis(Redis客戶端對象)

client = get_redis_connection()
client.hvals('...')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容