python面試題(三)

一.項目技術點梳理

(一)Django項目

本項目是用python的Django框架開發的先後端不分離項目。項目採用MVT架構,使用的MySQL和redis數據庫,用Django自帶的orm與數據庫交互。python

一、用戶模塊mysql

a.使用Django自帶的用戶認證系統,來完成用戶登陸,密碼使用pbkdf2_sha256加密存入mysql數據庫。nginx

b.使用itsinstance模塊對user_id進行加密生成token,將生成的token放在url經過郵件發送給用戶來實現激活邏輯。面試

c.使用celery+redis實現異步發送郵件,redis用來存儲任務隊列(broker);redis能夠替換爲rabbitMQ;也能夠改成短信驗證,也可使用celery異步實現。redis

二、商品模塊sql

a.使用FastDFS+nginx來實現靜態文件的管理。FastDFS負責寫入,nginx負責讀取。FastDFS實現了去除冗餘,負載均衡的功能。數據庫

b.異步實現主頁頁面靜態化。監聽admin後臺管理,當數據庫數據發生變化時,使用celery異步生成主頁的靜態文件。實現未登陸用戶訪問的是靜態頁面,登陸用戶訪問的是動態頁面,達到優化網站的目的。json

c.避免不停的鏈接mysql,使用redis作了一層緩存。flask

d.使用whoosh做爲全文搜索引擎,haystack做爲全文檢索的框架,jieba做爲中文分詞包來實現的全局搜索功能。後端

三、購物車模塊

a.購物車模塊使用先後端分離技術實現,使用json傳輸數據。

b.未登陸用戶的數據存放cookie中,已經登陸用戶的數據存放在session,用戶登陸後合併cookie和session,注意合併前判斷庫存

四、訂單模塊

a.Django事務的使用,在增刪改數據庫是出錯了要對數據庫進行回滾。

b.悲觀鎖和樂觀鎖的使用。悲觀鎖:當要操做某條記錄時,當即將該條記錄鎖起來,誰也沒法操做,直到它操做完。樂觀鎖:在查詢數據的時候不加鎖,在更新時進行判斷,判斷更新時的庫存和以前,查出的庫存是否一致。

c.使用支付寶api實現的付款。(芝麻信用的實名認證api也能夠提,在用戶實名認證那個模塊中)

五、項目部署

使用uWSGI+nginx實現動靜分離負載均衡。

 

(二)Flask項目(flask項目更側重於業務)

    本項目是使用flask框架開發的,先後端分離項目。項目主要使用flask框架,flask_sqlalchemy做爲orm,mysql和redis數據庫等技術。

一、登陸註冊

後端生成圖片驗證碼加容聯雲(阿里雲)短信認證明現用戶註冊。用戶登陸後將用戶信息存到session中來保持用戶的登陸狀態,登陸登出都是經過session來實現的。

二、我的中心

a.使用七牛雲(阿里雲)文件對象存儲系統來存儲用戶上傳的靜態文件。

b.使用芝麻信用實名認證接口來實現的用戶實名認證。

三、商品展現模塊

業務邏輯處理,根據項目具體狀況來講。這裏能夠重點說說業務知足了哪些需求。

四、訂單模塊

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查詢優化

一、儲存引擎選擇:若是數據表須要事務處理,應該考慮使用InnoDB,由於它徹底符合ACID特性。若是不須要事務處理,使用默認存儲引擎MyISAM是比較明智的

二、分表分庫,主從。

三、對查詢進行優化,要儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引

四、應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描

五、應儘可能避免在 where 子句中使用 != 或 <> 操做符,不然將引擎放棄使用索引而進行全表掃描

六、應儘可能避免在 where 子句中使用 or 來鏈接條件,若是一個字段有索引,一個字段沒有索引,將致使引擎放棄使用索引而進行全表掃描

七、Update 語句,若是隻更改一、2個字段,不要Update所有字段,不然頻繁調用會引發明顯的性能消耗,同時帶來大量日誌

八、對於多張大數據量(這裏幾百條就算大了)的表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。

相關文章
相關標籤/搜索