本項目是用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_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)
數據庫鏈接池(Connection pooling)是程序啓動時創建足夠的數據庫鏈接,並將這些鏈接組成一個鏈接池,由程序動態地對池中的鏈接進行申請,使用,釋放。
建立數據庫鏈接是一個很耗時的操做,也容易對數據庫形成安全隱患。因此,在程序初始化的時候,集中建立多個數據庫鏈接,並把他們集中管理,供程序使用,能夠保證較快的數據庫讀寫速度,還更加安全可靠。
假設網站一天有很大的訪問量,數據庫服務器就須要爲每次鏈接建立一次數據庫鏈接,極大的浪費數據庫的資源,而且極易形成數據庫服務器內存溢出、拓機。
數據庫鏈接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現的尤其突出.對數據庫鏈接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標.數據庫鏈接池正式針對這個問題提出來的.數據庫鏈接池負責分配,管理和釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而不是從新創建一個。
1.優化索引、SQL 語句、分析慢查詢;
2.設計表的時候嚴格根據數據庫的設計範式來設計數據庫;
3.使用緩存,把常常訪問到的數據並且不須要常常變化的數據放在緩存中,能節約磁盤IO
4.優化硬件;採用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等
5.採用MySQL 內部自帶的表分區技術,把數據分層不一樣的文件,可以提升磁盤的讀取效率;
6.垂直分表;把一些不常常讀的數據放在一張表裏,節約磁盤I/O;
7.主從分離讀寫;採用主從複製把數據庫的讀操做和寫入操做分離開來;
8.分庫分表分機器(數據量特別大),主要的的原理就是數據路由;
9.選擇合適的表引擎,參數上的優化
10.進行架構級別的緩存,靜態化和分佈式;
11.不採用全文索引;
12.採用更快的存儲方式,例如 NoSQL存儲常常訪問的數據。
一、儲存引擎選擇:若是數據表須要事務處理,應該考慮使用InnoDB,由於它徹底符合ACID特性。若是不須要事務處理,使用默認存儲引擎MyISAM是比較明智的
二、分表分庫,主從。
三、對查詢進行優化,要儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引
四、應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
五、應儘可能避免在 where 子句中使用 != 或 <> 操做符,不然將引擎放棄使用索引而進行全表掃描
六、應儘可能避免在 where 子句中使用 or 來鏈接條件,若是一個字段有索引,一個字段沒有索引,將致使引擎放棄使用索引而進行全表掃描
七、Update 語句,若是隻更改一、2個字段,不要Update所有字段,不然頻繁調用會引發明顯的性能消耗,同時帶來大量日誌
八、對於多張大數據量(這裏幾百條就算大了)的表JOIN,要先分頁再JOIN,不然邏輯讀會很高,性能不好
HTTP:是互聯網上應用最爲普遍的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小。
HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。
HTTPS協議的主要做用能夠分爲兩種:一種是創建一個信息安全通道,來保證數據傳輸的安全;另外一種就是確認網站的真實性。
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。