2019-11-14

面試

Django相關(guān)

Django REST framework 框架是一個(gè)用于構(gòu)建Web API 的強(qiáng)大而又靈活的工具。

通常簡(jiǎn)稱為DRF框架 或 REST framework。

特點(diǎn):

提供了定義序列化器Serializer的方法,可以快速根據(jù) Django ORM 或者其它庫自動(dòng)序列化/反序列化;

提供了豐富的類視圖、Mixin擴(kuò)展類,簡(jiǎn)化視圖的編寫;

豐富的定制層級(jí):函數(shù)視圖、類視圖、視圖集合到自動(dòng)生成 API,滿足各種需要;

多種身份認(rèn)證和權(quán)限認(rèn)證方式的支持;

內(nèi)置了限流系統(tǒng);

直觀的 API web 界面;

可擴(kuò)展性,插件豐富

Django的中間件

Django的中間件就是一個(gè)類,分別是process_request,process_respone,process_view,process_exception,process_render_template。

中間件的應(yīng)用場(chǎng)景

做ip限制

放在中間件類的列表中華,阻止了某些ip的訪問

2,URL訪問過濾

如果用戶訪問的是login視圖

如果訪問其他視圖(需要檢測(cè)是不是有session已經(jīng)有了放行,沒有返回login),這樣就省在多個(gè)視圖函數(shù)上寫裝飾器

3、緩存

客戶端請(qǐng)求來了,中間件去緩存看看有沒有數(shù)據(jù),有直接返回給用戶,沒有再去邏輯層執(zhí)行視圖函數(shù)

HTTP相關(guān)

互聯(lián)網(wǎng)通信協(xié)議http協(xié)議,是一個(gè)無狀態(tài)協(xié)議。

客戶端用到的手段,只能是http協(xié)議,四個(gè)表示操作方式的動(dòng)詞:get,post,put,delete。它們分別對(duì)應(yīng)四種操作:get用來獲取資源,post用來新建資源(也可以用于更新資源),put用來更新資源,delete用來刪除資源

計(jì)算機(jī)網(wǎng)絡(luò)傳輸協(xié)議分層

1.osi七層模型

從上到下:應(yīng)用層 (應(yīng)用程序的通信服務(wù))

? ? 表示層 (定義數(shù)據(jù)格式及加密)

? ? 會(huì)話層? ()

? ? 傳輸層? ()

? ? 網(wǎng)絡(luò)層 ()

? ? 數(shù)據(jù)鏈路層 ()

? ? ? 物理層? ()

2.五層模型

從上到下:

應(yīng)用層 (應(yīng)用程序的通信服務(wù))

表示層 (定義數(shù)據(jù)格式及加密)

網(wǎng)絡(luò)層 (定義包傳輸,定義節(jié)點(diǎn)的邏輯地址,定義路由實(shí)現(xiàn)和學(xué)習(xí)的方式,定義包的分段方法)

數(shù)據(jù)鏈路層(定義單個(gè)鏈路如何傳輸數(shù)據(jù))

物理層(傳輸介質(zhì)的標(biāo)準(zhǔn)定制)

http是超文本傳輸協(xié)議,是客戶端瀏覽器或其他程序與web服務(wù)器之間的應(yīng)用層通信協(xié)議。

tcp(面向連接)通過序列化應(yīng)答和必要時(shí)重發(fā)數(shù)據(jù)包,tcp為應(yīng)用程序提供了可靠的傳輸流和虛擬連接服務(wù)。

udp(用戶數(shù)據(jù)報(bào)協(xié)議)是與tcp相對(duì)應(yīng)的協(xié)議,它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接把數(shù)據(jù)包發(fā)送過去

tcp/udp區(qū)別:1、tcp面向連接,udp是無連接,發(fā)送數(shù)據(jù)之前不需要連接

? ? 2、安全方面:tcp提供可靠服務(wù),通過tcp連接傳送數(shù)據(jù),無差錯(cuò),不丟失,不重復(fù),且按序到達(dá)

? udp盡最大努力交付,即不保證可靠交付

? 3、傳輸效率的區(qū)別

? TCP傳輸效率相對(duì)較低

? udp傳輸效率高,適用對(duì)高傳輸和實(shí)時(shí)性有較高的通信或廣播

? 4、連接對(duì)象數(shù)量的區(qū)別

? tcp連接只能是點(diǎn)到點(diǎn),一對(duì)一的。

? udp支持一對(duì)一,一對(duì)多,和多對(duì)一和多對(duì)多的交互通信

Http是應(yīng)用層協(xié)議,tcp是傳輸層協(xié)議!

數(shù)據(jù)包在網(wǎng)絡(luò)傳輸過程中,http被封裝在tcp包內(nèi)

什么是nginx?

nginx 是一個(gè)高性能http和反向代理服務(wù)器,也是一個(gè)(IMAP/POP3)代理服務(wù)器? 目前使用的最多的web服務(wù)器或者是代理服務(wù)器。

為什么要用nginx?

優(yōu)點(diǎn):1.跨平臺(tái),配置簡(jiǎn)單 2、非阻塞。高并發(fā)連接;處理2-3w并發(fā)連接數(shù) 3、內(nèi)存消耗小 4、內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,在發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)服務(wù)器,重新將請(qǐng)求提交到其他節(jié)點(diǎn)上 5、節(jié)省寬帶 6、穩(wěn)定性高:宕機(jī)的概率非常小? 7、master/worker結(jié)構(gòu):一個(gè)master進(jìn)程,生成一個(gè)或者多個(gè)worker進(jìn)程 8、接受用戶請(qǐng)求的是異步,瀏覽器將請(qǐng)求發(fā)送到nginx服務(wù)器,它先將用戶請(qǐng)求全部接收下來,在一次性發(fā)送給后端web服務(wù)器,極大減輕了web服務(wù)器的壓力 9、一邊接收web服務(wù)器的返回?cái)?shù)據(jù),一邊發(fā)送給瀏覽器客戶端 10、網(wǎng)絡(luò)依賴性比較低,只要ping通就可以負(fù)載均衡? 11、可以有多臺(tái)nginx服務(wù)器? 12、事件驅(qū)動(dòng):通信機(jī)制采用epoll模型

為什么nginx性能那么高?

因?yàn)樗奶幚頇C(jī)制:異步非阻塞事件處理機(jī)制:運(yùn)用了epoll模型。提供了一個(gè)隊(duì)列,排隊(duì)解決

為什么不使用多線程?

因?yàn)榫€程創(chuàng)建上下文的切換非常消耗資源,線程占用內(nèi)存大,上下文切換占用cpu也很高,采用epoll模型避免了和這個(gè)缺點(diǎn)

uwsgi是一個(gè)web 服務(wù)器,他實(shí)現(xiàn)了wsgi協(xié)議,uwsgi、http等協(xié)議。

wsgi是一種通信協(xié)議。 uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用在uwsgi服務(wù)器與其他網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)通信

uwsgi是實(shí)現(xiàn)了uwsgi和wsgi兩種協(xié)議的web服務(wù)器

websocket特點(diǎn):1.建立在tcp協(xié)議之上,服務(wù)器端的實(shí)現(xiàn)比較容易? 2、與http協(xié)議有良好的兼容性,默認(rèn)端口是80和443,通信握手階段采用了http協(xié)議,能通過各種http代理服務(wù)器 3、數(shù)據(jù)格式比較輕量,性能開銷小,通信高效? 4.可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)? 5.沒有同源策略的限制,客戶端(瀏覽器)可以任意與服務(wù)器通信

Mysql 相關(guān)

數(shù)據(jù)庫的結(jié)構(gòu)設(shè)計(jì),和優(yōu)化?

第一范式:保證列的原子性,保證列不可在分

第二范式:唯一性;一個(gè)表只能說明一個(gè)事物,有主鍵且非主鍵依賴主鍵

第三范式:每列都與主鍵有直接關(guān)系,不存在傳遞依賴

Ps:第二范式要遵循第一范式,第三范式要遵循第二范式

數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化的目的有哪些?

l? 減少數(shù)據(jù)冗余

l? 盡量避免數(shù)據(jù)維護(hù)中出現(xiàn)更新,插入,刪除異常。

l? 節(jié)約數(shù)據(jù)查詢空間

優(yōu)化mysql數(shù)據(jù)庫的8個(gè)方法

l? 選取最合適的字段j

l? 使用join來代替子查詢

l? 使用聯(lián)合來代替手動(dòng)創(chuàng)建的臨時(shí)表

l? 事務(wù)? (1.維護(hù)數(shù)據(jù)庫的完整性。2.當(dāng)多個(gè)用戶同時(shí)使用相同的數(shù)據(jù)源時(shí),它可以利用鎖定數(shù)據(jù)庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其他用戶干擾)

事務(wù)的缺點(diǎn):因?yàn)槭聞?wù)的獨(dú)占性,有時(shí)候會(huì)影響數(shù)據(jù)庫的性能,在事務(wù)執(zhí)行過程中,數(shù)據(jù)庫被鎖定,其他用戶請(qǐng)求只能等待該事務(wù)結(jié)束,當(dāng)訪問量大時(shí),就會(huì)產(chǎn)生較嚴(yán)重的響應(yīng)延遲

l? 鎖定表 (可以維護(hù)數(shù)據(jù)的完整性,但是不能保證數(shù)據(jù)的關(guān)聯(lián)性)

l? 使用外鍵

l? 使用索引? (索引應(yīng)該建立在join,where,判斷和orderby排序字段上。盡量不要對(duì)數(shù)據(jù)庫中某個(gè)含有大量重復(fù)的值的字段建立索引。)

l? 優(yōu)化查詢語句 (查詢的時(shí)候盡量不要select * ,盡量使用索引字段查詢)

多線程,多進(jìn)程,celery分布式任務(wù),定時(shí)任務(wù)和異步任務(wù)

l? 線程:一個(gè)運(yùn)行的程序就是一個(gè)進(jìn)程

l? 進(jìn)程:調(diào)度執(zhí)行的最小單位,也叫執(zhí)行路徑,不能獨(dú)立存在,依賴進(jìn)程存在一個(gè)進(jìn)程至少有一個(gè)線程,叫主線程,

進(jìn)程間內(nèi)存是否是存是共享,如何實(shí)現(xiàn)通訊?

進(jìn)程間內(nèi)存不共享

可以通過Manage模塊加鎖

通過隊(duì)列或通過管道加鎖

Socket實(shí)現(xiàn)通訊

l? 協(xié)程:是一種用戶態(tài)的輕? ? ? 量級(jí)線程,協(xié)程的調(diào)度完全由用戶控制

Celery是分布式異步消息任務(wù)隊(duì)列。

優(yōu)點(diǎn):

l? 簡(jiǎn)單

l? 高可用:當(dāng)任務(wù)執(zhí)行失敗或執(zhí)行過程中發(fā)生連接中斷,celery會(huì)自動(dòng)嘗試重新執(zhí)行任務(wù)

l? 快速:一個(gè)單進(jìn)程的celery每分鐘可以處理上百萬個(gè)任務(wù)

l? 靈活:幾乎celery的各個(gè)組件都可以被擴(kuò)展及定制

Celery支持定時(shí)任務(wù),celery啟動(dòng)任務(wù)有兩種方式:1.在程序中指定2.在配置文件中指定

Celery異步任務(wù),一些耗時(shí)較長(zhǎng)的操作,比如i/o操作,可以交給celery去異步執(zhí)行,用戶提交后可以做其他事情,讓任務(wù)完成后將結(jié)果返回用戶,可以提高用戶體驗(yàn)。

同步和異步關(guān)注的是消息通信機(jī)制

同步就是在發(fā)出一個(gè)調(diào)用之后,在沒有得到結(jié)果之前,該調(diào)用就不返回,但是一旦調(diào)用返回,就得到了返回值(就是調(diào)用者主動(dòng)等待這個(gè)調(diào)用結(jié)果)

異步剛好相反,調(diào)用在發(fā)出去之后,這個(gè)調(diào)用就可以直接返回,所以沒有返回結(jié)果,當(dāng)一個(gè)異步調(diào)用過程調(diào)用發(fā)出去后,調(diào)用者不會(huì)立刻得到結(jié)果,而是在調(diào)用發(fā)出去后,被調(diào)用著通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。

Mysql的復(fù)制原理及負(fù)載均衡

Mysql主從復(fù)制工作原理

在主庫上把數(shù)據(jù)更高紀(jì)錄到二進(jìn)制日志

從庫將主庫的日志復(fù)制到自己的中繼日志

從庫讀取中繼日志的事件,將其重放到從庫數(shù)據(jù)中

Mysql主從復(fù)制解決的問題

數(shù)據(jù)分布:隨意開始或停止復(fù)制,并在不同地理位置分布數(shù)據(jù)備份

負(fù)載均衡:降低單個(gè)服務(wù)器的壓力

高可用和故障切換:幫助應(yīng)用程序避免單點(diǎn)失敗

升級(jí)測(cè)試:可以用更高版本的mysql作為從庫

說說mysql數(shù)據(jù)庫存儲(chǔ)的原理?

存儲(chǔ)過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存,它可以有sql語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者是封裝特定功能時(shí),存儲(chǔ)過程是非常有用的,數(shù)據(jù)庫中額度存儲(chǔ)過程客戶看做是對(duì)編程中面向?qū)ο蠓椒ǖ哪M,他允許控制數(shù)據(jù)的訪問方式。

說一下事物的特效?

原子性:事物中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么俊不執(zhí)行

一致性:幾個(gè)并行執(zhí)行的事務(wù),其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致。

隔離性:事物的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對(duì)其他事務(wù)必須是透明的。

持久性:對(duì)于任意已交事務(wù),系統(tǒng)必須保證該事務(wù)對(duì)數(shù)據(jù)庫的改變不被丟失,即使數(shù)據(jù)庫

MyISAM不支持事務(wù),InnoDB支持事務(wù)。表鎖雖然開銷小,鎖表快,但高并發(fā)下性能低。行鎖雖然開銷大,鎖表慢,但高并發(fā)下相比之下性能更高。事務(wù)和行鎖都是在確保數(shù)據(jù)準(zhǔn)確的基礎(chǔ)上提高并發(fā)的處理能力。

MySQL常用的存儲(chǔ)引擎是InnoDB,相對(duì)于MyISAM而言。InnoDB更適合高并發(fā)場(chǎng)景,同時(shí)也支持事務(wù)處理。

行鎖的劣勢(shì):開銷大;加鎖慢;會(huì)出現(xiàn)死鎖

行鎖的優(yōu)勢(shì):鎖的粒度小,發(fā)生鎖沖突的概率低;處理并發(fā)的能力強(qiáng)

加鎖的方式:自動(dòng)加鎖。對(duì)于UPDATE、DELETE和INSERT語句,InnoDB會(huì)自動(dòng)給涉及數(shù)據(jù)集加排他鎖;對(duì)于普通SELECT語句,InnoDB不會(huì)加任何鎖;

表鎖:開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定力度大,發(fā)生鎖沖突概率高,并發(fā)度最低

行鎖:開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度小,發(fā)生鎖沖突的概率低,并發(fā)度高

頁鎖:開銷和加鎖速度介于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖之間,并發(fā)度一般

什么時(shí)候使用表鎖

對(duì)于InnoDB表,在絕大部分情況下都應(yīng)該使用行級(jí)鎖,因?yàn)槭聞?wù)和行鎖往往是我們之所以選擇InnoDB表的理由。但在個(gè)別特殊事務(wù)中,也可以考慮使用表級(jí)鎖。

第一種情況是:事務(wù)需要更新大部分或全部數(shù)據(jù),表又比較大,如果使用默認(rèn)的行鎖,不僅這個(gè)事務(wù)執(zhí)行效率低,而且可能造成其他事務(wù)長(zhǎng)時(shí)間鎖等待和鎖沖突,這種情況下可以考慮使用表鎖來提高該事務(wù)的執(zhí)行速度。

第二種情況是:事務(wù)涉及多個(gè)表,比較復(fù)雜,很可能引起死鎖,造成大量事務(wù)回滾。這種情況也可以考慮一次性鎖定事務(wù)涉及的表,從而避免死鎖、減少數(shù)據(jù)庫因事務(wù)回滾帶來的開銷。

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖。

設(shè)定網(wǎng)站用戶數(shù)量在千萬級(jí),但是活躍用戶的數(shù)量只有1%,如何通過優(yōu)化數(shù)據(jù)庫提高活躍用戶訪問速度?

可以使用Mysql的分區(qū),把活躍用戶分在一個(gè)區(qū),不活躍用戶分在一個(gè)區(qū),本身活躍用戶區(qū)數(shù)據(jù)量比較少,因此可以提高活躍用戶的訪問速度

還可以水平分表,把活躍用戶分在一張表,不活躍用戶分在一張表,可以提高活躍用戶訪問速度

通信相關(guān)

阻塞/非阻塞和同步異步

阻塞:在進(jìn)行socket通信中,一個(gè)線程發(fā)起請(qǐng)求,如果當(dāng)前請(qǐng)求沒有返回結(jié)果,則進(jìn)入sleep狀態(tài),期間線程掛起不能做其他操作,直到有返回結(jié)果,或者超時(shí)(如果設(shè)置超時(shí)的話)

非阻塞:與阻塞相似,只不過在等待請(qǐng)求結(jié)果時(shí),線程并不掛起而是進(jìn)行其他操作,既在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻掛起當(dāng)前線程,而是會(huì)立刻返回。

進(jìn)程問題

進(jìn)程間內(nèi)存是否是共享?如何實(shí)現(xiàn)通訊?

進(jìn)程間內(nèi)存不共享

1.可以通過Manage模塊加鎖

2.通過隊(duì)列或通過管道加鎖

3.Socket實(shí)現(xiàn)通訊

請(qǐng)聊聊進(jìn)程隊(duì)列的特點(diǎn)和實(shí)現(xiàn)原理?

先進(jìn)先出

后進(jìn)先出

優(yōu)先級(jí)隊(duì)列

線程本身帶鎖通過put()和get()數(shù)據(jù),同一時(shí)間只有一個(gè)線程運(yùn)行修改任務(wù)實(shí)現(xiàn)數(shù)據(jù)安全

請(qǐng)畫出進(jìn)程的三狀態(tài)轉(zhuǎn)換圖

就緒====運(yùn)行

?? ? \阻塞/

python基礎(chǔ)

談?wù)刾ython的裝飾器,迭代器,yield

裝飾器:裝飾器的本質(zhì)是一個(gè)閉包函數(shù),他的作用就是讓其他函數(shù)在不需要任何代碼修改的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象,我們通常在一些有切面需求的場(chǎng)景,比如:插入日志,性能測(cè)試,事物處理,緩存,權(quán)限校驗(yàn)等場(chǎng)景,有了裝飾器就可以少寫很多重復(fù)代碼,提高效率

迭代器:迭代器是一種訪問可迭代對(duì)象的方式,通常從第一個(gè)元素開始訪問,知道所有的元素都被訪問完才結(jié)束,迭代器只能前進(jìn)不能后退,使用迭代器可以不用事先準(zhǔn)備好迭代過程中的所有元素,僅僅是在迭代到該元素的時(shí)候才能計(jì)算該元素,而在這之前的元素則是被銷毀,因此迭代器適合遍歷一些數(shù)據(jù)量巨大的無限的序列。

可迭代對(duì)象就可以用for循環(huán)語句進(jìn)行遍歷的對(duì)象就是可迭代對(duì)象。

迭代器的本質(zhì)就是調(diào)用iter方法,每次調(diào)用的時(shí)候返回一個(gè)元素,當(dāng)沒有下一個(gè)元素的時(shí)候回排除StopIteration異常

如何解決線程安全?

線程安全是在多線程的環(huán)境下,能夠保證多個(gè)線程同時(shí)執(zhí)行時(shí)程序依舊運(yùn)行正確,而且要保證對(duì)于共享的數(shù)據(jù)可以由多個(gè)線程存取,但是同一時(shí)刻只能有一個(gè)線程進(jìn)行存取。多線程環(huán)境下解決資源競(jìng)爭(zhēng)問題的辦法是加鎖來保證存取操作的唯一性。如何加鎖?分布式 負(fù)載均衡

常用linux命令?

Ls ,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date等等

什么是面向?qū)ο缶幊?

回答:面向?qū)ο缶幊淌且环N軟件復(fù)用的設(shè)計(jì)和編程方法。這種方法把軟件系統(tǒng)中相近似的操作邏輯和操作應(yīng)用數(shù)據(jù)、狀態(tài),以類的形式述出來,以對(duì)象實(shí)例的形式在軟件系統(tǒng)中復(fù)用,以達(dá)到高軟件開發(fā)效率的作用。封裝,繼承多態(tài)

如何提高python的運(yùn)行效率,請(qǐng)說出不少于2種提高運(yùn)行效率的方法?

使用生成器

關(guān)鍵代碼使用外部功能包:Cython,Pylnlne、pypy、pyrex

針對(duì)循環(huán)的優(yōu)化—盡量避免在循環(huán)中訪問變量的屬性;

面試問題

問題一:已登錄用戶的購(gòu)物車放在哪里?未登錄用戶的購(gòu)物車放在哪里?

已登錄用戶的購(gòu)物車可以放在數(shù)據(jù)庫中(可以先在Redis中緩存);未登錄用戶的購(gòu)物車可以保存在Cookie、localStorage或sessionStorage中(減少服務(wù)器端內(nèi)存開銷)

登錄后購(gòu)物車合并

當(dāng)跳到購(gòu)物車頁面,查詢購(gòu)物車列表前,需要判斷用戶登錄狀態(tài),如果登錄:

首先檢查用戶的localStorage中是否有購(gòu)物車信息

如果有,則提交后臺(tái)保存

清空Localstorage

如果未登錄,直接查詢就好

調(diào)用支付寶第三方API接口

創(chuàng)建調(diào)用支付寶的對(duì)象

在線創(chuàng)建應(yīng)用時(shí)分配的ID

自己應(yīng)用的私鑰

支付寶的公鑰

調(diào)用獲取支付頁面操作

生成完整的支付頁面URL

通過上面返回的鏈接可以進(jìn)入支付頁面,支付完成后會(huì)自動(dòng)跳轉(zhuǎn)回上面代碼中設(shè)定好的項(xiàng)目頁面,在該頁面中可以獲得訂單號(hào)(out_trade_no)、支付流水號(hào)(trade_no)、交易金額(total_amount)和對(duì)應(yīng)的簽名(sign)并請(qǐng)求后端驗(yàn)證和保存交易結(jié)果,代碼如下所示:

創(chuàng)建調(diào)用支付寶的對(duì)象

創(chuàng)建調(diào)用支付寶的對(duì)象

自己應(yīng)用的私鑰

支付寶的公鑰

請(qǐng)求參數(shù)(假設(shè)是POST請(qǐng)求)中包括訂單號(hào)、支付流水號(hào)、交易金額和簽名

調(diào)用驗(yàn)證操作

超賣現(xiàn)象:比如某商品的庫存為1,此時(shí)用戶1和用戶2并發(fā)購(gòu)買該商品,用戶1提交訂單后該商品的庫存被修改為0,而此時(shí)用戶2并不知道的情況下提交訂單,該商品的庫存再次被修改為-1這就是超賣現(xiàn)象。解決超賣現(xiàn)象有三種常見的思路:

悲觀鎖控制:查詢商品數(shù)量的時(shí)候就用select ... for update對(duì)數(shù)據(jù)加鎖,這樣的話用戶1查詢庫存時(shí),用戶2因無法讀取庫存數(shù)量被阻塞,直到用戶1提交或者回滾了更新庫存的操作后才能繼續(xù),從而解決了超賣問題。但是這種做法對(duì)并發(fā)訪問量很高的商品來說性能太過糟糕,實(shí)際開發(fā)中可以在庫存小于某個(gè)值時(shí)才考慮加鎖,但是總的來說這種做法不太可取。

樂觀鎖控制:查詢商品數(shù)量不用加鎖,更新庫存的時(shí)候設(shè)定商品數(shù)量必須與之前查詢數(shù)量相同才能更新,否則說明其他事務(wù)已經(jīng)更新了庫存,必須重新發(fā)出請(qǐng)求。這種做法要求事務(wù)隔離級(jí)別為可重復(fù)讀,否則仍然會(huì)產(chǎn)生問題。

嘗試減庫存:將上面的查詢(select)和更新(update)操作合并為一條SQL操作,更新庫存的時(shí)候,在where篩選條件中加上庫存>=購(gòu)買數(shù)量或庫存-購(gòu)買數(shù)量>=0的條件。

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,672評(píng)論 1 32
  • 面試 Django REST framework 框架是一個(gè)用于構(gòu)建Web API 的強(qiáng)大而又靈活的工具。 通常簡(jiǎn)...
    C丶y_04a7閱讀 498評(píng)論 0 0
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 919評(píng)論 0 3
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,981評(píng)論 0 9
  • 正如所有即將離別的情侶,沒有人相信再也不見的意義??死锼沟賮喼Z羅納爾多與皇家馬德里,也要經(jīng)歷這樣的難過了。 九年的...
    公元1987閱讀 391評(píng)論 0 0

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