一.項目技術點梳理
(一)Django項目
本項目是用python的Django框架開發的前后端不分離項目。項目采用MVT架構,使用的MySQL和redis數據庫,用Django自帶的orm與數據庫交互。
1、用戶模塊
a.使用Django自帶的用戶認證系統,來完成用戶登錄,密碼使用pbkdf2_sha256加密存入mysql數據庫。
b.使用itsinstance模塊對user_id進行加密生成token,將生成的token放在url通過郵件發送給用戶來實現激活邏輯。
c.使用celery+redis實現異步發送郵件,redis用來存儲任務隊列(broker);redis可以替換為rabbitMQ;也可以改為短信驗證,也可以使用celery異步實現。
2、商品模塊
a.使用FastDFS+nginx來實現靜態文件的管理。FastDFS負責寫入,nginx負責讀取。FastDFS實現了去除冗余,負載均衡的功能。
b.異步實現主頁頁面靜態化。監聽admin后台管理,當數據庫數據發生變化時,使用celery異步生成主頁的靜態文件。實現未登錄用戶訪問的是靜態頁面,登錄用戶訪問的是動態頁面,達到優化網站的目的。
c.避免不停的連接mysql,使用redis做了一層緩存。
d.使用whoosh作為全文搜索引擎,haystack作為全文檢索的框架,jieba作為中文分詞包來實現的全局搜索功能。
3、購物車模塊
a.購物車模塊使用前后端分離技術實現,使用json傳輸數據。
b.未登錄用戶的數據存放cookie中,已經登錄用戶的數據存放在session,用戶登錄后合並cookie和session,注意合並前判斷庫存
4、訂單模塊
a.Django事務的使用,在增刪改數據庫是出錯了要對數據庫進行回滾。
b.悲觀鎖和樂觀鎖的使用。悲觀鎖:當要操作某條記錄時,立即將該條記錄鎖起來,誰也無法操作,直到它操作完。樂觀鎖:在查詢數據的時候不加鎖,在更新時進行判斷,判斷更新時的庫存和之前,查出的庫存是否一致。
c.使用支付寶api實現的付款。(芝麻信用的實名認證api也可以提,在用戶實名認證那個模塊中)
5、項目部署
使用uWSGI+nginx實現動靜分離負載均衡。
(二)Flask項目(flask項目更側重於業務)
本項目是使用flask框架開發的,前后端分離項目。項目主要使用flask框架,flask_sqlalchemy作為orm,mysql和redis數據庫等技術。
1、登錄注冊
后端生成圖片驗證碼加容聯雲(阿里雲)短信認證實現用戶注冊。用戶登錄后將用戶信息存到session中來保持用戶的登錄狀態,登錄登出都是通過session來實現的。
2、個人中心
a.使用七牛雲(阿里雲)文件對象存儲系統來存儲用戶上傳的靜態文件。
b.使用芝麻信用實名認證接口來實現的用戶實名認證。
3、商品展示模塊
業務邏輯處理,根據項目具體情況來說。這里可以重點說說業務滿足了哪些需求。
4、訂單模塊
a.業務上:生成訂單、接單、拒單、評論的實現
b.redis事務的使用
import redis import sys if __name__=="__main__": try: conn=redis.StrictRedis('192.168.80.41') pipe=conn.pipeline() pipe.sadd('s001','a') sys.exit() #在事務還沒有提交前退出,所以事務不會被執行。 pipe.sadd('s001','b') pipe.execute() except Exception as err: print(err)
二.面試中高頻考點
(三)進程、線程、協程
(四)Mysql與MongoDB類比記憶
(五)mysql連接池
數據庫連接池(Connection pooling)是程序啟動時建立足夠的數據庫連接,並將這些連接組成一個連接池,由程序動態地對池中的連接進行申請,使用,釋放。
創建數據庫連接是一個很耗時的操作,也容易對數據庫造成安全隱患。所以,在程序初始化的時候,集中創建多個數據庫連接,並把他們集中管理,供程序使用,可以保證較快的數據庫讀寫速度,還更加安全可靠。
假設網站一天有很大的訪問量,數據庫服務器就需要為每次連接創建一次數據庫連接,極大的浪費數據庫的資源,並且極易造成數據庫服務器內存溢出、拓機。
數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現的尤為突出.對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標.數據庫連接池正式針對這個問題提出來的.數據庫連接池負責分配,管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個。
(六)數據庫優化
1.優化索引、SQL 語句、分析慢查詢;
2.設計表的時候嚴格根據數據庫的設計范式來設計數據庫;
3.使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能節約磁盤IO
4.優化硬件;采用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等
5.采用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁盤的讀取效率;
6.垂直分表;把一些不經常讀的數據放在一張表里,節約磁盤I/O;
7.主從分離讀寫;采用主從復制把數據庫的讀操作和寫入操作分離開來;
8.分庫分表分機器(數據量特別大),主要的的原理就是數據路由;
9.選擇合適的表引擎,參數上的優化
10.進行架構級別的緩存,靜態化和分布式;
11.不采用全文索引;
12.采用更快的存儲方式,例如 NoSQL存儲經常訪問的數據。
(七)Mysql查詢優化
1、儲存引擎選擇:如果數據表需要事務處理,應該考慮使用InnoDB,因為它完全符合ACID特性。如果不需要事務處理,使用默認存儲引擎MyISAM是比較明智的
2、分表分庫,主從。
3、對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引
4、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
5、應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描
6、應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描
7、Update 語句,如果只更改1、2個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日志
8、對於多張大數據量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差
(八)http/https
HTTP:是互聯網上應用最為廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標准(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
HTTPS協議的主要作用可以分為兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
(九)restful風格
1. 將api部署在專用域名下
2. 將API的版本號放在url中
3. 路徑表示API的具體網址。每個網址代表一種資源。 資源作為網址,網址中不能有動詞只能有名詞,一般名詞要與數據庫的表名對應。而且名詞要使用復數。
4. 對於資源的具體操作類型,由HTTP動詞表示。 常用的HTTP動詞有四個。(get、post、put、delete)
5. 如果資源數據較多,服務器不能將所有數據一次全部返回給客戶端。API應該提供參數,過濾返回結果。
6. 服務器向用戶返回常用http標准狀態碼。
7. 服務器返回的錯誤信息,以鍵值對的形式返回。
8. 響應結果
返回商品列表GET http://www.example.com/goods
返回單個商品GET http://www.example.com/goods/cup
返回新生成的商品POST http://www.example.com/goods
返回一個空文檔 DELETE http://www.example.com/goods
9. 在返回響應結果時提供鏈接其他API的方法,使客戶端很方便的獲取相關聯的信息。
10.服務器返回的數據格式,應該盡量使用JSON,避免使用XML。