.net面試題-15k+左右


 

綜合

  1. 以前的項目中,主要解決了什么技術性 難題 ,如果出現問題,你如何迅速找到問題,你遇到問題都是怎么解決的

 根據出現的問題,大概排查出問出問題的幾個點,逐個排查, 錯誤日志- sql查詢計划-定位程序錯誤 reshare

解決秒殺: 集群,redis緩存,rabbitmq隊列,關閉評價服務等權重低的服務。

 

2. 關於代碼優化你怎么理解?你會考慮去代碼重構嗎?

1、對於代碼優化,之前的公司每周會做代碼審核,審核的主要作用就是保證代碼的正確性和執行效率,

2、  對於陳舊代碼,可能很多地方有調用,並且開發和維護人員很有可能不是同一個人,所以重構時要格外小心,

如果沒有十足的把握,不要輕易重構。如果必須要重構,必須做好充分的單元測試和全局測試。

 

3.架構設計需要滿足4點要求:

1. 能進行分布式存儲

2. 能實現負載均衡

3. 能根據用戶訪問量和圖片數量增加而動態增加服務器節點

4. 服務器節點的增加對用戶透明,不會中斷系統的運行

 

4. CAP原理:

Base理論:分區容錯前提下,優先保證可用性,然后最終結果一致就行

 

5. SignalR,是否寫過聊天室?

 

定義:是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能添加到應用程序的過程。實時 Web 功能是指這樣一種功能(聊天室,股票交易,微信角標,站內消息):當所連接的客戶端變得可用時服務器代碼可以立即向其推送內容,

而不是讓服務器等待客戶端請求新的數據。使用websocket通信,底層是socket (本質是編程接口(API),對TCP/IP的封裝,提供了網絡通信的能力).

當環境條件合適時,SignalRWebSocket作為底層傳輸方式的優先實現,當然,它也能很高效地回退到其他技術(長輪詢, ServerSendEvent)。同時,SignalR提供了非常良好的Api以供遠程調用(RPC) 瀏覽器中的js代碼。

SignalR有兩種連接,分為Persistent Connection(永久連接) 與 Hubs

           Persistent Connection:表示一個發送單個,編組,廣播信息的簡單終結點。開發人員通過使用持久性連接Api,直接訪問SignalR公開的底層通信協議。

Hubs是基於連接Api的更高級別的通信管道,它允許客戶端和服務器上彼此直接調用方法,SignalR能夠很神奇地處理跨機器的調度,使得客戶端和服務器端能夠輕松調用在對方端上的方法。使用Hub還允許開發人員將強類型的參數傳遞給方法並且綁定模型

        4種方式:

  1. 輪詢(polling以前的方式)客戶端以一定時間間隔中向服務器發送Ajax查詢請求大,但是也因此,當服務器端內容並沒有顯著變化時,這種連接方式將帶來很多無效的請求,造成服務器資源損耗。適合並發量小,實時性要求低的應用模型,更像是定時任務。優點:實現最為簡單,配置簡單,出錯幾率小. 缺點:每次都是一次完整的http請求,易延遲,有效請求命中率少,並發較大時,服務器資源損耗大
  2. long polling長輪詢, 長輪詢是對輪詢的改進,客戶端通過請求連接到服務器,並保持一段時間的連接狀態,直到消息更新或超時才返回Response並中止連接,可以有效減少無效請求的次數。屬於Comet實現. 優點:有效減少無效連接,實時性較高.缺點:客戶端和服務器端保持連接造成資源浪費,服務器端信息更新頻繁時,long polling並不比polling高效,並且當數據量很大時,會造成連續的polls不斷產生,性能上反而更糟糕
  3. WebSocket 是HTML5提供的一種在單個 TCP 連接上進行全雙工通訊的協議,目前chrome、Firefox、Opera、Safari等主流版本均支持,Internet Explorer從10開始支持。另外因為WebSocket 提供瀏覽器一個原生的 socket實現,所以直接解決了 Comet 架構很容易出錯的問題,而在整個架構的復雜度上也比傳統的實現簡單得多。優點:服務器與客戶端之間交換的數據包檔頭很小,節約帶寬。全雙工通信,服務器可以主動傳送數據給客戶端。缺點:舊版瀏覽器不支持。

使用條件:


1.正在使用跨域連接,並且符合以下條件(以下不滿足任一條則使用長輪詢)
(1).客戶端支持CORS
(2).客戶端支持WebSocket
(3).服務器端支持WebSocket
2.不配置使用JSONP,連接不跨域並且客戶端和服務器端都支持WebSocket
(1).客戶端支持CORS
(2).客戶端支持WebSocket
(3).服務器端支持WebSocket

 

  1. ServerSendEvent  客戶端或服務器端不支持Websocket時使用
  2. Forever Frame EventSource不可用(基本上除了IE外都支持)時使用

6. .netframework的運行機制: 編譯器會將源代碼編譯成Microsoft中間語言(MSIL)有時也稱為中間語言(IL)。當程序運行時,實時(JIT)編譯器將MSIL轉換為特定機器的本機代碼,實時編譯器是公共語言運行庫的一部分。

7. 項目管理要素:

工作范圍、時間、質量、成本:

68.1范圍(Scope )。也稱為工作范圍,指為了實現項目目標必須完成的所有工作。(完成哪些工作就可以達到項目的目標”,或者說 “完成哪些工作項目就可以結束了)

68.2. 時間(Time )。項目時間相關的因素用進度計划描述,進度計划不僅說明了完成項目工作范圍內所有工作需要的時間,也規定了每個活動的具體開始和完成日期。

68.3 成本(Cost )。指完成項目需要的所有款項,包括人力成本、原材料、設備租金、分包費用和咨詢費用等。項目的總成本以預算為基礎,項目結束時的最終成本應控制在預算內。

68.4 質量(Quality )。是指項目滿足明確或隱含需求的程度。

 

8. 解決高並發

1. 緩存

2. HTML靜態化

3. 數據庫讀寫分離mssql訂閱發布

4、分布式集群

5、鏡像

6、負載均衡

7. 分庫分表

8. 業務拆分,做微服務

9. 使用隊列

 

9. 微服務

微服務架構是一個用分布式服務拆分業務邏輯,完成解耦的架構模式。(就是把以前的Bll改成服務,跨進程調用服務來完成功能)

微服務------進程之間通信:

共享存儲: Redis,DB,Queue,硬盤文件等等,被動式通信,門檻低。

服務通信: WebSoeket, WebService,WCF,WebApi,ashx,aspx等等,主動觸發,數據序列化傳遞,跨平台,跨語言,http穿透防火牆.

RPC: .net Remoting(.net獨有,不支持跨平台);gRPC(高性能,開源,通用的RPC框架,面向服務端和移動端,基於http/2設計)

微服務------服務實例集群

Consul:服務注冊與發現,健康檢查

微服務------網關:Gateway:提供統一服務入口,對前台透明.聚合后台服務,節省流量,提高性能。提供安全,過濾,流量控制等管理功能,就是一個configuration.json

緩存

熔斷:單位時間內異常多少次,就指定時間內,網關直接返回失敗。

限流:單位時間內,流量只允許多少次。(張善友寫的)

降級:特殊情況下可以降低服務器等級,甚至關閉。

微服務------鑒權&授權:JWT

微服務------瞬態故障處理:

Polly是一種.net彈性和瞬態處理庫,允許我們以非常順暢和線程安全的方式來執行諸如 重試,斷路,超時,故障恢復等策略。

微服務------分布式追蹤(常用軟件Skyworking):

分布式追蹤和APM的Server端,它將包含Collector,Stroage,獨立的WebUI,並使用OpenTracing規范來設計追蹤數據。

微服務------ExceptionLess:

ExceptionLess:開源的日志收集和分析框架,能為應用程序提供實時錯誤,特性和日志報告。

微服務------統一配置中心:

Apollo:配置管理平台,能夠集中化管理應用不同環境,不同集群的配置,配置修改后能實時推送到應用端,並且具備規范的權限、流程治理等特性。

微服務------分布式事務:

CAP理論

微服務------容器化docker:

Docker:是一個開源的應用程序引擎,可以打包應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的linux或者windows機器上,也可以實現虛擬化

微服務------容器編排K8S(管理docker):

Kubernetes編排容器,是管理應用的全生命周期的工具,從創建應用/部署,應用提供服務,擴容縮容,更新,都非常方便,而且可以做到故障自愈。

微服務------CI/CD:

Jenkins是一個開源的,提供友好操作界面的持續集成(CI)工具,主要用於持續、自動的構建/測試軟件項目、監控外部任務的運行。

 

10. redis:(Remote Dictionary Server )

即遠程字典服務,是一個開源的key-value數據結構存儲系統,可以用作數據庫,緩存,消息中間件MQ(發布,訂閱). 它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)和范圍查詢geospatial 地理位置,Geopos 獲取坐標,Geodist 獲取兩個城市的距離。數據都是緩存在內存中。redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。通過持久化機制把內存中的數據同步到硬盤文件來保證數據持久化。當Redis重啟后通過把硬盤文件重新加載到內存,就能達到恢復數據的目的。

 

Redis單條命令是保存原子性的,但是事務不保證原子性,沒有隔離級別的概念。只有發起命令exec時才會被執行,執行完以后銷毀該事務。編譯時異常,不執行事務,運行時異常(1/0),其他命令可以執行,錯誤拋出異常.

Reids事務本質:一組命令的集合,一個事務中的所有命令都會被序列化,在事物的執行過程中,會按照順序執行。 一次性,順序性,排他性。

Redis默認有16個數據庫。

 

悲觀鎖:什么操作都加鎖,耗性能。

Watch 樂觀鎖:什么時候都不會上鎖,只有更新的時候,獲取version,判斷下是否有人更改了這個數據。 如果失敗了,就使用unwatch取消鎖,然后再開啟樂觀鎖

 

持久化: 只做緩存的話,沒必要持久化。

實現:單獨創建fork()一個子進程,將當前父進程的數據庫數據復制到子進程的內存中,然后由子進程寫入到臨時文件中,持久化的過程結束了,再用這個臨時文件替換上次的快照文件,然后子進程退出,內存釋放。

1. Rdb就是子進程創建快照(默認,修復快,運行快,適合大規模數據修復,對數據完整性要求不高,但是需要一定時間操作,如果redis宕機,那最后一次操作就丟失了,fork進程的時候,會占用一部分的內存空間)。按照一定的時間周期策略把內存的數據以快照的形式保存到硬盤的二進制文件,對應產生的數據文件為dump.rdb。

2.AOF:以日志的形式來記錄每個寫操作,只追加文件,redis啟動時會讀取該文件重新構建數據,就是把所有寫操作都來一遍。每次修改都同步,文件的完整性更好,效率最高,但是修復慢,運行慢。

 

哨兵模式:是個獨立的進程,類似服務注冊與發現、心跳檢測,是主從復制的升級,自動檢測是否可用,不過在線擴容麻煩。可以做哨兵集群。

 

緩存穿透(緩存查不到,直接查數據庫)

布隆過濾器:是一種數據結構,對所有可能查詢的參數以hash存儲,在控制層校驗,不符合則丟棄,避免了對底層存儲系統的查詢壓力

緩存空對象

緩存擊穿(大量查詢單個熱點緩存的時候,緩存過期了)

設置熱點數據永不過期,

加互斥鎖(分布式鎖):每個key同時只能有一個線程去查詢后端,其他線程等待,將高並發的壓力轉移到分布式鎖上。

緩存雪崩:某個時間段內,緩存集體失效(redis宕機,秒殺數據緩存集體過期)

集群

限流降級:緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。

緩存預熱:正式部署之前,先把可能訪問的數據,都訪問一遍,手動加載都緩存中,設置不通的過期時間,讓緩存的失效時間盡量均勻。

 

單線程的redis為什么這么快

 

(一)純內存操作

(二)單線程操作,避免了頻繁的上下文切換

(三)采用了非阻塞I/O多路復用機制

 

redis采用的是定期刪除+惰性刪除策略。

redis默認每個100ms隨機抽取檢查,是否有過期的key,有過期key則刪除,如果只采用定期刪除策略,會導致很多key到時間沒有刪除。於是,惰性刪除派上用場,。也就是說在你獲取某個key的時候,redis會檢查一下key過期就刪除。如果定期刪除沒刪除key。然后你也沒即時去請求key,redis的內存會越來越高,那么就應該采用內存淘汰機制。

在redis.conf中有一行配置maxmemory-policy volatile-lru

該配置就是配內存淘汰策略的

volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據,新寫入操作會報錯ps:如果沒有設置 expire 的key, 不滿足先決條件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致。

 

 為什么是單線程的

因為Redis是基於內存的操作,CPU不是Redis的瓶頸,並且單線程容易實現,所以是單線程,利用隊列技術將並發訪問變為串行訪問。

 

Redis 集群方案:只用過redis cluster3.0 自帶的集群,特點在於他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設置從節點。

 

Redis 常見性能問題和解決方案?

Master 最好不要做任何持久化工作,如 RDB 內存快照和 AOF 日志文件(2) 如果數據比較重要,某個 Slave 開啟 AOF 備份數據,策略設置為每秒同步一次(3) 為了主從復制的速度和連接的穩定性, Master 和 Slave 最好在同一個局域網內(4) 盡量避免在壓力很大的主庫上增加從庫(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即: Master <- Slave1 <- Slave2 <-Slave3…

 

Redis事務

Redis事務功能是通過MULTI、EXEC、DISCARD和WATCH 四個原語實現的Redis會將一個事務中的所有命令序列化,然后按順序執行。

1.redis 不支持回滾,Redis 在事務失敗時不進行回滾,而是繼續執行余下的命令, 所以 Redis 的內部可以保持簡單且快速。

2.如果在一個事務中的命令出現錯誤,那么所有的命令都不會執行;

3.如果在一個事務中出現運行錯誤,那么正確的命令會被執行。注:redis的discard只是結束本次事務,正確命令造成的影響仍然存在.

1)MULTI命令用於開啟一個事務,它總是返回OK。 MULTI執行之后,客戶端可以繼續向服務器發送任意多條命令,這些命令不會立即被執行,而是被放到一個隊列中,當EXEC命令被調用時,所有隊列中的命令才會被執行。

2)EXEC:執行所有事務塊內的命令。返回事務塊內所有命令的返回值,按命令執行的先后順序排列。 當操作被打斷時,返回空值 nil 。

3)通過調用DISCARD,客戶端可以清空事務隊列,並放棄執行事務, 並且客戶端會從事務狀態中退出。

4)WATCH 命令可以為 Redis 事務提供 check-and-set (CAS)行為。 可以監控一個或多個鍵,一旦其中有一個鍵被修改(或刪除),之后的事務就不會執行,監控一直持續到EXEC命令。

Redis實現分布式鎖

Redis為單進程單線程模式,采用隊列模式將並發訪問變成串行訪問,且多客戶端對Redis的連接並不存在競爭關系。Redis中可以使用SETNX命令實現分布式鎖。將 key 的值設為 value ,當且僅當 key 不存在。 若給定的 key 已經存在,則 SETNX 不做任何動作。

解鎖:使用 del key 命令就能釋放鎖解決死鎖:

1)通過Redis中expire()給鎖設定最大持有時間,如果超過,則Redis來幫我們釋放鎖。

2) 使用 setnx key “當前系統時間+鎖持有的時間”和getset key “當前系統時間+鎖持有的時間”組合的命令就可以實現。

 

11. API跨域

1. josnp

2. 后台模擬http請求(httpclient)

3 在服務器端指定允許跨域

3.1 指定一個方法跨域,方法中添加 base.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*");

3.2 指定全部方法跨域(添加方法特性或者控制器特性)

3.3 netcore中間件跨域

 

12. elasticsearch:是一個開源的高擴展的RESTful 風格的分布式全文檢索引擎。它可以近乎實時的存儲、檢索數據,本身擴展性很好,可以擴展到上百台服務器,處理PB級別的數據。也可以使用lucene作為你核心來實現所有索引和搜索的工功能,但它的目的是通過簡單的RESTfulAPI來隱藏Lucene的復雜性,從而讓全文搜索變得簡單。使用ES做一個全文索引,我們將經常查詢的商品的某些字段,比如說商品名,描述、價格還有id這些字段我們放入我們索引庫里,可以提高查詢速度。還可以設置搜索的權重,例如搜索電腦,會首先搜索商品名稱,然后再搜索分類和描述。

 

ELK: 是指elasticsearch、Logstash(中央數據流引擎,收集數據后通過過濾輸出到不同的目的地[文件、redis\es])、Kibana。

在config中elasticsearch.yml 中,最后添加下面的代碼,允許跨域訪問。

在bin中雙擊 elasticsearch.bat啟動elasticsearch,瀏覽器輸入 http://localhost:9200/ ,顯示下圖,表示成功

下載kibana((將es數據友好展示,提供實時分析功能)),在config中的kibana.yml,最后一句添加 i18n.locale: "zh-CN",界面漢化,瀏覽器輸入http://localhost:5601/app/kibana#/home,打開首頁.

下載分詞器ik,然后在elasticsearch\elasticsearch-7.8.0\plugins 中新建ik文件夾,把代碼解壓到這里.可以在elasticsearch 的bin的 cmd中,使用elasticsearch-plugin list查看是否安裝成功,ik有兩個分詞算法:ik_smark(最少切分) ik_max_word(最細粒度划分)

倒排索引是什么

傳統的我們的檢索是通過文章,逐個遍歷找到對應關鍵詞的位置。而倒排索引,是通過分詞策略,形成了詞和文章的映射關系表,這種詞典+映射表即為倒排索引。有了倒排索引,就能實現 o(1)時間復雜度的效率檢索文章了,極大的提高了檢索效率。倒排索引,相反於一篇文章包含了哪些詞,它從詞出發,記載了這個詞在哪些文檔中出現過,由兩部分組成——詞典和倒排表。倒排索引的底層實現是基於:FST(Finite State Transducer, 空間占用小, 查詢速度快)數據結構。

 

13. gRpc:

所謂RPC(remote procedure call 遠程過程調用)框架實際是提供了一套機制,使得應用程序之間可以進行通信,而且也遵從server/client模型.

gRPC和restful API都提供了一套通信機制,用於server/client模型通信,而且它們都使用http作為底層的傳輸協議(嚴格地說, gRPC使用的http2.0,而restful api則不一定)。

  1. 性能監控 優化系統性能 都會從哪方面操作,用到哪些工具,怎么操作

1.硬件調優:添加內存條,帶寬

2.軟件調優:

2.1用空間換時間:。各種cache數據緩沖,CDN數據鏡象,負載均衡

2.2用時間換空間:(網絡傳輸縮數據的算法),簡化代碼, 代碼調優\算法調優\內存分配\異步操作\網絡調優網卡調優\數據庫調優 \Web服務器\數據庫分離

OneAPM 通過自動探知 Web 端用戶、關鍵應用、數據庫請求、外部調用等各層級應用組件,繪制全局拓撲,直觀展示組件性能及相互調用時間,其中包括網絡耗時。可以實時了解哪些環節成為了系統的性能瓶頸,做出有針對性的優化

百度應用性能監測中心(http://developer.baidu.com/apm/)和齊雲測(http://ce.cloud.360.cn/)也可以

 

  1. Aop:面向切面編程,能在不破壞封裝的前提下,額外擴展功能,代碼復用,集中管理,類似Fillter,過濾器,場景:權限,校驗,性能監控,數據壓縮, 異常處理,日志,緩存,事務等等

.netcore中生命周期 1. AuthorizationFilter 2. ResourceFilter 3. ActionFilter 4.ExcptionFilter 5. ResultFilter

3種注冊方式 1. action注冊(就是放在action的特性 2. 控制器注冊, 該控制所有的操作都從走這個方法 3全局注冊,全局生效

 

  1. 說一說你最大的優勢:

優點是很會處理與人的關系,性格上來說很樂觀,對一件事情喜歡從一而終,選擇了就要好好做下去.適應力強,能很快融入團隊,盡快給公司創造價值.

缺點是遇見難題,不睡覺也要弄出來,要不睡不踏實,分配給別人的任務,老不放心.老想着親力親為.

 

  1. 作為架構師或者技術經理,怎么進行技術選型?
    1. 先測試、研究,再決定,選擇的軟件技術,
    2. 要能快速地實現應用程序的構建, 技術選型必須貼着業務來選擇.
    3. 對於未經驗證的新技術、新理念的引入一定要慎重,一定要在全方位的驗證過后,再大規模的的使用。
    4. 適當的選擇熟悉的技術, 選擇擁有強大社區支撐的項目
    5. 整體的技術選型流程:“列出需求”-“細分需求”-“明確搜索方向”-“網絡搜索”-“明確評判標准”-“分頭執行”-“匯總材料”-“初步選擇”-“進一步調研”-“會議評審”-“做出決定”

 

  1. 緩存如何設計?千萬級並發!如何設計一個多級緩存系統?

多級緩存系統,就是指在一個系統 的不同的架構層級進行數據緩存,以提升訪問效率。

整個多級緩存系統被分為三層,應用層nginx緩存,分布式redis緩存集群,tomcat堆內緩存。整個架構流程如下:

  1. 當接收到一個請求時,首先會分發到nginx集群中,這里可以采用nginx的負載均衡算法分發給某一台機器,使用輪詢可以降低負載,或者采用一致性hash算法來提升緩存命中率。
  2. 當nginx層沒有緩存數據時,會繼續向下請求,在分布式緩存集群中查找數據,如果緩存命中,直接返回(並且寫入nginx應用緩存中),如果未命中,則回源到tomcat集群中查詢堆內緩存。
  3. 在分布式緩存中查詢不到數據,將會去tomcat集群中查詢堆內緩存,查詢成功直接返回(並寫入分redis主集群中),查詢失敗請求數據庫;堆內緩存。
  4. 如果以上緩存中都沒有命中,則直接請求數據庫,返回結果,同步數據到分布式緩存中。

 

 

  1. 快速有效過濾關鍵字/敏感詞

es創建敏感詞庫,如果有敏感詞就替換

二叉樹(這個不會)

 

  1. 獲取一個數組中最大的數字,使用的方式有哪些?

快速排序:通過多次比較和交換來實現排序, ,說白了就是給基准數據找其正確索引位置的過程.示例如下

 static void Main(string[] args)

 {

            int[] array = { 49, 38, 65, 97, 76, 13, 27 };

            sort(array, 0, array.Length - 1);

            Console.ReadLine();

 }

 /**一次排序單元,完成此方法,key左邊都比key小,key右邊都比key大。

**@param array排序數組 

**@param low排序起始位置 

**@param high排序結束位置

**@return單元排序后的數組 */

 

  private static int sortUnit(int[] array, int low, int high)

        {

            int key = array[low];

            while (low < high)

            {

                /*從后向前搜索比key小的值*/

                while (array[high] >= key && high > low)

                    --high; 

                /*比key小的放左邊*/

                array[low] = array[high];   

                /*從前向后搜索比key大的值,比key大的放右邊*/

                while (array[low] <= key && high > low)

                    ++low; 

                /*比key大的放右邊*/

                array[high] = array[low];

            }

            /*左邊都比key小,右邊都比key大。//將key放在游標當前位置。//此時low等於high */

            array[low] = key;

            foreach (int i in array)

            {

                Console.Write("{0}\t", i);

            }

            Console.WriteLine();

            return high;

        }    

 /**快速排序 

*@paramarry 

*@return */

        public static void sort(int[] array, int low, int high)

        {

            if (low >= high)

                return; 

            /*完成一次單元排序*/

            int index = sortUnit(array, low, high); 

            /*對左邊單元進行排序*/

            sort(array, low, index - 1);

            /*對右邊單元進行排序*/

            sort(array, index + 1, high);

        }

 

.net

  1. 單例:可以保證系統中一個類只有一個實例,並且自行實例化向整個系統提供(例如一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務)

最簡單的就是寫考慮線程安全的單例模式,網站的計數器,日志, Web應用的配置對象的讀取,數據庫連接池,多線程的線程池

簡單工廠:所有類的new都放到一個工廠類中進行

工廠模式:定義公共接口,每新增一個產品類,就需要添加一個實現該接口的工廠類

抽象工廠:跟工廠模式類似,定義公共接口,只是一個類中有多個產品。

 

public class Singleton

{

// 定義一個靜態變量來保存類的實例

private static Singleton uniqueInstance;

// 定義一個標識確保線程同步

private static readonly object locker = new object();

// 定義私有構造函數,使外界不能創建該類實例

private Singleton() {}

// 定義公有方法提供一個全局訪問點,同時你也可以定義公有屬性來提供全局訪問點

public static Singleton GetInstance()

{

// 雙重鎖定只需要一句判斷就可以了

if (uniqueInstance == null)

{

lock (locker)

{

// 如果類的實例不存在則創建,否則直接返回

if (uniqueInstance == null)

{

uniqueInstance = new Singleton();

}

}

}

return uniqueInstance;

}

}

 

2.IIS的工作原理?在什么情況下進程會被回收

此題主要考的是.net framework和IIS是如何結合呈現頁面的;

1、當客戶端發送HTTP Request時,服務端的HTTP.sys(可以理解為IIS的一個監聽組件) 攔截到這個請求;

2、HTTP.sys 聯系 WAS 向配置存儲中心請求配置信息。

3、然后將請求傳入IIS的應用程序池。

4、檢查請求的后綴,啟動aspnet_isapi.dll這個dll,這個dll是.net framework里面的,也就是說到這一步,請求進入了.net framework的管轄范圍。

5、這個時候如果是WebForm,開始執行復雜的頁面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);如果是MVC,則啟動mvc的路由機制,根據路由規則為URL來指定HttpHandler

6、httpHandler處理請求后,請求結束,給出Response,客戶端處理響應,整個過程結束

 

3. RabitMQ:場景:應用解耦、異步、流量削鋒、數據分發、錯峰流控、日志收集等等...

 

核心思想就是生產者和消費者隔離,生產者從不直接將消息發送給隊列。生產者通常不知道是否一個消息會被發送到隊列中,只是將消息發送到一個交換機。

先由Exchange來接收,然后Exchange按照特定的策略轉發到Queue進行存儲。同理,消費者也是如此。Exchange 就類似於一個交換機,轉發各個消息分發到相應的隊列中

RabbitMQ提供了四種Exchange模式:fanout,direct,topic,header 。 header模式在實際使用中較少。

1.Fanout Exchange(發布訂閱): 所有發送到Fanout Exchange的消息都會被轉發到與該Exchange 綁定(Binding)的所有Queue上。

 Fanout Exchange: 不需要處理RouteKey 。只需要簡單的將隊列綁定到exchange 上。這樣發送到exchange的消息都會被轉發到與該交換機綁定的所有隊列上。類似子網廣播,

每台子網內的主機都獲得了一份復制的消息。所以,Fanout Exchange 轉發消息是最快的。

2.Direct (指定路由) 所有發送到Direct Exchange的消息被轉發到RouteKey中指定的Queue。Direct模式,可以使用rabbitMQ自帶的Exchange:default Exchange 。所以不需要將Exchange進行任何綁定(binding)操作 。

消息傳遞時,RouteKey必須完全匹配,才會被隊列接收,否則該消息會被拋棄。、

3.Topic Exchange(占位符指定路由):所有發送到Topic Exchange的消息被轉發到所有關心RouteKey中指定Topic的Queue上。

Exchange 將RouteKey 和某Topic 進行模糊匹配。此時隊列需要綁定一個Topic。可以使用通配符進行模糊匹配,符號“#”匹配一個或多個詞,符號“*”匹配不多不少一個詞。因此“log.#”能夠匹配到“log.info.oa”,

但是“log.*” 只會匹配到“log.error”。所以,Topic Exchange 使用非常靈活。

如何確保消息正確地發送至RabbitMQ?

使用發送方確認模式,確保消息正確地發送到RabbitMQ,信道會發送一個確認給生產者(包含消息唯一ID).當確認消息到達生產者應用程序,生產者應用程序的回調方法就會被觸發來處理確認消息。

如何避免消息重復投遞或重復消費?

        在消息生產時,MQ內部針對每條生產者發送的消息生成一個inner-msg-id,作為去重和冪等的依據(消息投遞失敗並重傳),避免重復的消息進入隊列;在消息消費時,要求消息體中必須要有一個bizId(對於同一業務全局唯一,如支付ID、訂單ID、帖子ID等)作為去重和冪等的依據,避免同一條消息被重復消費。

       

 

 

4. webservice api的安全性:

1.使用TOKEN+簽名認證

1.1做一個認證服務,提供一個認證的WebApi,用戶先訪問它獲取對應的Token

1.2 用戶拿着相應的Token以及請求的參數和服務器端提供的簽名算法計算出簽名后再去訪問指定的Api

1.3服務器端每次接收到請求就獲取對應用戶的Token和請求參數,服務器端再次計算簽名和客戶端簽名做對比,如果驗證通過則正常訪問相應的Api,驗證失敗則返回具體的失敗信息

2. 使用簽名來保證ASP.NET MVC 和 WebApi的接口安全。給每個http請求添加一個簽名,服務端來驗證簽名的合法性,如果簽名合法則執行響應的操作,如果簽名非法則直接拒絕請求。

簽名算法一般都使用Hash散列算法。簽名參數 可以用Http請求的queryString然后加上時間戳還有隨機數來作為簽名的參數

3.基於Owin OAuth;使用OAuth的Client Credential Grant授權方式,在服務端通過Authorization Server的一個實現成功發放了Access Token,並在客戶端成功拿到了Access Token。

在ASP.NET WebApi中啟用OAuth的Access Token驗證非常簡單,只需在相應的Controller或Action加上[Authorize]標記。在ASP.NET中基於Owin OAuth`

 

5. JWT(鑒權授權):

用戶提交賬號密碼給服務器,成功的話,jwt創建一個token返回給用戶,存儲在客戶端cookie中,jwt的字符串是使用.(點)連接的三段字符串,

token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

第一段是 header,json轉成字符串以后baseurl64加密

{

"alg": "HS256",

"typ": "JWT"

}

 

第二段是 PAYLOAD 有效載荷,登錄成功以后的用戶相關信息,id,賬號,過期時間等等,,json轉成字符串以后baseurl64加密

{

"sub": "1234567890",

"name": "John Doe",

"iat": 1516239022,

“exp”:” 1516239022”

}

第三段是 VERIFY SIGNATURE 簽名

將第一和第二段的密文拼接起來進行HS256加密+加鹽,把生成的密文再次進行baseurl64加密

加鹽:用戶在輸入密碼注冊后,隨機生成一個 salt,一定要是隨機生成的。然后按照一定的混淆規則,將 salt 撒入到明文密碼中,最后將加鹽后的密碼做消息摘要,將 salt 和密碼的消息摘要傳給服務器。服務器如何匹配用戶密碼是否正確呢?用戶用同樣的方式對原始密碼加鹽再生成摘要,發送給服務器,服務器匹配摘要。因為鹽是隨機生成的,不用每次都生成鹽,鹽可以存在本地或者服務器,加鹽的規則只要不泄漏出去就行,這樣的處理比簡單的對密碼摘要要安全很多。

 

校驗方式:

由於token不存儲在服務器,所以需要用戶訪問的時候(攜帶token),去校驗token

1.使用點(.)分割token,成3段

2.對第二段進行baseurl64解密,獲取payload信息,檢測token是否過期

3.將第一和第二段的密文拼接起來進行HS256加密+加鹽,把生成的密文再次進行baseurl64加密

4.將token和密文比較,一樣就是沒有被更改的

 

6. Quartz:開源的作業調度框架。所謂作業調度其實就是按照程序的設定,某一時刻或者時間間隔去執行某個代碼,有調度器Scheduler,觸發器Trigger,任務Job,任務詳情JobDetail日歷-Calendar,JobDataMap,cron表達式,quartz.properties文件組成.

Trigger是用來定義Job的執行規則,主要有四種觸發器,其中SimpleTrigger和CronTrigger觸發器用的最多。

SimpleTrigger:從某一個時間開始,以一定的時間間隔來執行任務。它主要有兩個屬性,repeatInterval  重復的時間間隔;repeatCount 重復的次數,實際上執行的次數是n+1,因為在startTime的時候會執行一次。

     CronTrigger:適合於復雜的任務,使用cron表達式來定義執行規則。

CalendarIntervalTrigger:類似於SimpleTrigger,指定從某一個時間開始,以一定的時間間隔執行的任務。 但是CalendarIntervalTrigger執行任務的時間間隔比SimpleTrigger要豐富,它支持的間隔單位有秒,分鍾,小時,天,月,年,星期。相較於SimpleTrigger有兩個優勢:1、更方便,比如每隔1小時執行,你不用自己去計算1小時等於多少毫秒。

2、支持不是固定長度的間隔,比如間隔為月和年。但劣勢是精度只能到秒。它的主要兩個屬性,interval 執行間隔;intervalUnit 執行間隔的單位(秒,分鍾,小時,天,月,年,星期)

 DailyTimeIntervalTrigger:指定每天的某個時間段內,以一定的時間間隔執行任務。並且它可以支持指定星期。它適合的任務類似於:指定每天9:00 至 18:00 ,每隔70秒執行一次,並且只要周一至周五執行。它的屬性有startTimeOfDay 每天開始時間;endTimeOfDay 每天結束時間;daysOfWeek 需要執行的星期;interval 執行間隔;intervalUnit 執行間隔的單位(秒,分鍾,小時,天,月,年,星期);repeatCount 重復次數

 

7. 冒泡排序

int[] aa = { 1,5,2,3,7 };

int temp;

for (int i = 0; i < aa.Length; i++)

{

for (int j = 0; j < aa.Length-i-1;j++ )

{

if(aa[j+1]<aa[j])

{

temp = aa[j];

aa[j]=aa[j+1];

aa[j + 1] = temp;

}

}

}

for (int i = 0; i < aa.Length;i++ )

{

textBox1.Text += aa[i];

}

這是bai從小到大順序排列du,如果zhi要從大到小排列只需將地dao7行的<改為>即可

 

8. 類和結構的異同

        Class可以被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。

        Struct屬於值類型,是分配在內存的棧上的。結構體是復制傳遞的。加分的回答:Int32、Boolean等都屬於結構體。

 

堆和棧的區別

                棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。

堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

 

值類型和引用類型的區別:

                1.將一個值類型變量賦給另一個值類型變量時,將復制包含的值。引用類型變量的賦值只復制對對象的引用,而不復制對象本身。

2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。

3.值類型不可能包含 null 值:然而,可空類型功能允許將 null 賦給值類型。

4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。 

 

        接口和類

不同點:

不能直接實例化接口。

接口不包含方法的實現。

接口可以多繼承,類只能單繼承。

類定義可在不同的源文件之間進行拆分。

相同點:

接口、類和結構都可以從多個接口繼承。

接口類似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。

接口和類都可以包含事件、索引器、方法和屬性。

 

基礎知識:接口只能定義方法(只能定義行為,不能定義實現也就是字段),因為事件、索引器、屬性本質上都是方法,所以接口中也可以定義事件、索引器、屬性。

 

        abstract class和interface

相同點:

都不能被直接實例化,都可以通過繼承實現其抽象方法。

不同點:

接口支持多繼承;抽象類不能實現多繼承。

接口只能定義行為;抽象類既可以定義行為,還可能提供實現。

接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;

抽象類可以定義字段、屬性、包含有實現的方法。 

接口可以作用於值類型(Struct)和引用類型(Class);抽象類只能作用於引用類型。例如,Struct就可以繼承接口,而不能繼承類。

加分的補充回答:講設計模式的時候SettingsProvider的例子。

 

9. IIS經典模式和集成模式

經典模式是為了與之前的版本兼容,使用ISAPI擴展來調用ASP.NET運行庫,原先運行於IIS6.0下的Web應用程序遷移到IIS7.0中只要將應用程序配置成經典模式,代碼基本不用修改就可以正常運行。集成模式是一種統一的哀求處理管道,它將ASP.NET請求管道與IIS核心管道組合在一起,這種模式能夠提供更好的性能,能夠實現配置和治理的模塊化,而且增加了使用托管代碼模塊擴展IIS時的靈活性。假如老的Web應用程序運行於IIS7.0的集成模式下,可能需要對應用程序的web.config文件進行修改,尤其是使用了實現IHttpHandler接口的自定義模塊的情況。IIS7.0在同一個服務器上能夠同時支持兩種模式的應用程序。

 

10. 內存分配

 CLR管理的內存主要有三塊, 也就是我們對象實例分配在這三塊內存區域:
1.     線程的棧: 用於分配值類型實例, 由操作系統管理, 不受垃圾收集器的控制, 當值類型實例所在的方法結束, 其存儲單元自動釋放. 棧的執行效率高, 但容量有限.
2.     GC堆: 用於分配小對象實例(小於85000字節的引用類型). 但有內存分配或垃圾回收時, 垃圾收集器可能會對GC堆壓縮. 
3.     LOH堆: 用於分配大對象實例(大於85000字節的引用類型大對象實例), LOH堆不會被壓縮, 只有在GC堆全部被回收后, LOH堆才會被回收.
我們常說的托管堆就是指GC堆和LOH堆

 

11.sizeof:用來計算類型的大小,單位是字節,sizeof只適用於值類型,並且需要在unsafe上下文環境中使用

class Program

{

static void Main(string[] args)

{

MyUglyClass m = new MyUglyClass();

m.myChar1 = 'd';

m.myInt = 25;

m.myChar2 = 'a';

unsafe

{

Console.WriteLine(sizeof(MyUglyClass));

}

 

}

}

運行,繼續報錯:"不安全代碼只會在使用 /unsafe 編譯的情況下出現"。
解決方法是:右鍵項目→屬性→生成→勾選"允許不安全代碼"→保存,再次運行,結果:12。

 

12.Filter?Attribute?

Filter:根據用途和執行時機的不同,MVC主要分為以下5種類型的過慮器:ResourceFilter、AuthorizationFilter、ActionFilter、ExceptionFilter、ResultFilter.

IMvcFilter只有兩個只讀屬性成員Order(排序,正序)和AllowMultiple(允許多個);

 

Attribute:ActionFilterAttribute, AuthorizationFilterAttribute,有2個屬性,執行前,執行后。

 

13. IHttpModule與IHttpHandler

先IHttpModule,后IHttpHandler.

 IHttpModule:無論客戶端請求的是什么文件,都會調用到它;例如aspx,rar,html的請求,對請求進行預處理,如驗證、修改、過濾等等,同時也可以對響應進行處理 

 

IHttpHandler:,只有ASP.net注冊過的文件類型(例如aspx,asmx等等)才會輪到調用它,按照你的請求生成響應的內容,是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面做出編譯和執行,並將處理過后的信息附加在HTTP請求信息流中再次返回到HttpModule中

 

.netcore

1.ASP net core哪些好的功能

遵循了dot net的標准架構, 可以運行於多個操作系統上。它更快,更容易配置,更加模塊化,可擴展性更強。

第一是依賴注入

第二是日志系統架構

第三是引入了一個跨平台的網絡服務器,kestrel。可以沒有iis, apache和nginx就可以單獨運行,開源,linux安裝一個runtime就行。

第四是可以使用命令行創建應用

第五是更好的支持異步編程

第六是使用start up來注冊服務

 

2.dot net core工程里面有多少個工程文件?

global, launch setting,app settings,bundle config,bower, package。

 

  1. 描述一下依賴注入后的服務生命周期,好處?

依賴注入減少了一個類和其他類的耦合並且減少了依賴.提升了代碼的可復用性

 

在dot net core中,我們不需要關心如何釋放這些服務, 因為系統會幫我們釋放掉。有三種服務的生命周期。

控制反轉IOC,去掉對細節的依賴,方便擴展,減少影響范圍:甚至轉移到配置文件依賴,只需要改配置文件就行了, 屏蔽細節.ioc(控制反轉)是一種設計模式(容器中創建實例),DI(依賴注入)是實現手段。除了構造函數注入(ServicesCollection支持,后兩個不支持),還有屬性注入,方法注入

services.AddTransient<ITestServiceC, TestServiceC>();//瞬時,即時構造(常用)

services.AddSingleton<ITestServiceC, TestServiceC>();//單例-全程唯一(不建議太多單例,一般只在(配置文件,線程池 等)需要的地方才單例)

services.AddScoped<ITestServiceC, TestServiceC>();//作用域單例,本質是容器實例單例(一個http請求就是一個單例,這說明一次請求會創建一個容器實例)例如 事務,數據庫連接,主要適用於一次請求只需要一個對象,多個請求需要多個對象

需要安裝AutoFac 等包,配置Program,把默認的Ioc容器 ServicesCollections替換成 Autofac

 

4. startup中的 ConfigureServices和Configure的區別

ConfigureServices:用於配置依賴注入以在運行時根據依賴關系創建對象

Configure: 用於配置中間件(middleware)以構建請求處理流水線

 

5. .netcore負載均衡

        1. 轉接頭中間件

       2. Nginx

前端

1.在瀏覽器輸入網址,Enter之后發生了什么?

輸入網址后DNS(域名解析協議)將網址轉換成對應的IP,然后網絡在路由表中查找最適合一條路由連接到對應的服務器ip,也就是剛剛轉換的ip.此時,傳輸層tcp經過三次握手后建立連接,服務器收到http請求(get/post)等后,進行相應的處理並把結果數據返回到瀏覽器上,此時輸入網址后對應的信息就會顯示出來.

  1. 前端優化

減少 HTTP 請求的次數,啟用瀏覽器緩存,css文件放 在<head>里面,js文件盡量放在頁面的底部,使用壓縮的css和js文件,如果條件允許,盡量使用CDN的方式引用文件

盡量避免重復的css,盡量減少js里面循環的次數

 

3. Http協議

1、http協議是瀏覽器和服務器雙方共同遵循的規范,是一種基於TCP/IP應用層協議

2、http是一種典型的請求/響應協議。客戶端發送請求,請求的內容以及參數存放到請求報文里面,服務端收到請求后,做出響應,

返回響應的結果放到響應報文里面。通過F12可以查看請求報文和響應報文

3、http協議是”無狀態”的,當客戶端向服務端發送一次http請求后,服務端收到請求然后返回給客戶端相應的結果,服務器會立即斷開連接並釋放資源。

在實際開發過程中,我們有時需要“保持”這種狀態,所以衍生出了Session/Cookie這些技術。

4、http請求的方式主要有get/post。http狀態碼:200(請求成功)、404(請求的資源不存在)、403(禁止訪問)、5xx(服務端錯誤)

 

4. tcp、ip三次握手,udp

第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

   第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據,

tcp是面向鏈接,三次握手是為了保持連接性。

udp是非面相鏈接,就是發送時不需要和對方建立連接,也不需要理會對方是否接收。udp發送的數據內容,用戶是可以進行驗證的。

 

5. 4層協議和7層協議

7層協議:OSI是一個開放性的通信系統互連參考模型,它是一個定義得非常好的協議規范。上到下分別是 7 應用層(HTTPFTPNFSSMTP等) 6 表示層(定義數據格式及加密) 5 會話層(定義了如何開始、控制和結束一個會話,,例如RPC) 4 傳輸層 (TCPUDP)3 網絡層 (對端到端的包傳輸進行定義,例如IP)2 數據鏈路層 (定義了在單個鏈路上如何傳輸數據,示例:ATMFDDI等)1 物理層(有關傳輸介質的特性)

4層協議:應用層,傳輸層,網絡層,數據鏈路層(光纖等)

 

6. Nginx

一款免費的、自由的、開源的、高性能HTTP服務器和反向代理服務器,高性能、穩定性、豐富的功能、簡單的配置和低資源消耗。本身就可以托管網站(類似於Tomcat一樣),進行Http服務處理,也可以作為反向代理服務器 、負載均衡器和HTTP緩存,跨平台,配置異常簡單,非阻塞、高並發連接,Nginx代理和后端Web服務器間無需長連接,Nginx接收用戶請求是異步的,網絡依賴性低,可以實施負載均衡(輪詢,權重), 內存消耗小、成本低廉節省帶寬、穩定性高等.

反向代理服務器可以隱藏源服務器的存在和特征。它充當互聯網雲和web服務器之間的中間層。這對於安全方面來說是很好的,特別是當您使用web托管服務時

最佳用法是在網絡上部署動態HTTP內容,使用SCGI、WSGI應用程序服務器、用於腳本的FastCGI處理程序。它還可以作為負載均衡器。

 

 

7. MVC如何保持session?

設置session的過期時間

 

8.301,302,303分別是什么意思

301 Moved Permanently(永久移動)

302臨時重定向,client發送post請求,server返回URL和302。如果用戶確認,client發送post請求,很多瀏覽器發送get請求。

303臨時重定向,發送Post請求,收到303,直接重定向為get,發送get請求,不需要向用戶確認

307臨時重定向,客戶端發送post請求返回307時,瀏覽器詢問用戶是否再次post

以前瀏覽器碰到302,都是按303那樣處理的。

9. cookie的 path,domain?

domain表示的是cookie所在的域, 默認為請求的地址,如網址為www.test.com/test/test.aspx,那么domain默認為www.test.com.

path表示cookie所在的目錄,asp.net默認為/,就是根目錄.

瀏覽器會將domain和path都相同的cookie保存在一個文件里,cookie間用*隔開

10. http頭信息

HostOrigin(請求的來源域名和端口號 (跨域請求時,瀏覽器會自動帶上這個頭信息), Referer,User-Agent,CookieAcceptAccept-EncodingAccept-LanguageConnectionDateExpiresCache-ControlLast-ModifiedContent-Type

 

11. js中的系統對象,數據類型和函數名稱

系統對象:Object、Function、Array、String、Boolean、Number、Date,ERROR,Global,Math 

數據類型: null , undefined, boolean,number,string, 引用類型(object、array、function), Symbol(這種類型的對象永不相等即始創建的時候傳入相同的值,可以解決屬性名沖突的問題,做為標記。)

函數名稱: alert, confirm, eval, isNaN, parseFloat, parseInt, join, reverse
,sort, getDate, abs,ceil,floor,max,min,random,round,charAt,indexOf,length,

 

數據庫

1.sql語句慢,你怎么調試出來?怎么解決?

Sql執行計划,mysql是explain

索引,首先考慮在 where及order by涉及的列上建索引

使用“臨時表”暫存中間結果,將臨時結果暫存在臨時表,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了並發性能

不要把SQL語句寫得太復雜,一般,將一個Select語句的結果作為子集,然后從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計划

使用like進行模糊查詢時,除非必要,否則不要在關鍵詞前加%

盡量避免在where中對null判斷、!=或<>、or 來連接條件(適用union all)、in (exists 代替 in)和 not in 也要慎用(使用between)、避免在 where 子句中對字段進行表達式操作,函數操作,否則就是全表掃描

2.數據庫移植,就是sql,換成mysql,底層怎么做

使用dapper,調用的接口不改變,將數據映射成 xml,就可以了。

 

3.數據庫鎖有幾種

共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁; 通常是該頁被讀取完畢,S鎖立即被釋放。

排它(X)鎖:僅允許一個事務封鎖此頁;其他任何事務必須等到X鎖被釋放才能對該頁進行訪問;X鎖一直到事務結束才能被釋放。

更新(U)鎖:用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;當被讀取的頁將要被更新時,則升級為X鎖;U鎖一直到事務結束時才能被釋放。

4.聚集索引和非聚集索引:

聚集索引確定表中數據的物理順序,類似於電話簿,分配一塊連續的空間,由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引

非聚集索引 隨機分配一塊空間,數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。

 

5.事務的特性,隔離級別 ?大多數數據庫默認的事務隔離級別是Read committed

1. 原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾

2. 一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。

3. 隔離性是當多個用戶並發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離。

4. 持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的

隔離級別

1. Read uncommitted讀未提交,就是一個事務可以讀取另一個未提交事務的數據。

2. Read committed 讀提交,顧名思義,就是一個事務要等另一個事務提交后才能讀取數據

3. Repeatable read 重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作

4. Serializable 序列化Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

 

6. MongoDB:定義:開源,高性能,無模式的文檔數據庫,應用場景:解決 高並發,海量數據的訪問和存儲,對數據庫的高擴展性和高可用性,具體場景: 社交,游戲,物流,物聯網,直播等等。缺點:對事務性的支持不大友好,沒有復雜的join。

7. show engines ; 查詢mysql數據庫支持的引擎是MyISAM(性能優先,表鎖) 還是InnoDB(默認,事務優先,行鎖)

8. 數據庫三大范式:1 列不可再分 2 必須有主鍵 3表的非主屬性不能依賴其他表的非主屬性外鍵約束

9.索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表里所有記錄的引用指針。數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用B樹及其變種B+樹。

mysql 使用Explain 模擬優化器執行SQL語句,分析查詢語句或是結構的性能瓶頸, id越大執行優先級越高,id相同則從上往下執行,id為NULL最后執行 查詢索引信息。可以設置慢查詢日志,來查看具體慢的sql.

Explain select * from user

 

主鍵索引,唯一索引,普通索引,全文索引 4種索引

10. 設計投票系統需要的主要幾張表

 

11. 多表連接查詢中有幾種連接方式

 

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 

right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯結字段相等的行

cross join(交叉連接) 沒有where條件的交叉連接將產生連接表所涉及的笛卡爾積。即TableA的行數*TableB的行數的結果集

full join(全連接) 只要多表中某個表存在匹配的行,就返回行數據

union(結果集合) 將多張表的select語句獲得的結果集合並在一起,數據不能重復。

union all(結果集合) 將多張表的select語句獲得的結果集合並在一起,數據可以重復。

12. 數據庫讀寫分離的鏈接怎么寫

        寫只有一個鏈接,往主庫寫入。

        讀有多個鏈接,配置的時候,輪詢/權重/隨機 三種算法獲取其中一個鏈接字符串,讀取從庫數據。

13. mysql和mssql有什么區別,關鍵字有什么不同?

MySQL是一個免費的、bai開放源du代碼的SQL數據庫,安裝特別簡單,

mysql不支持nchar,nvarchar,ntext類型,mysql的遞增語句是AUTO_INCREMENT,mysql需要為表指定存儲類型,關鍵字是`包裹,日期是cur_date(),當前完整時間是 now(),只支持一種存儲引擎,關鍵字 EXPLAIN,Now(),Limit

docker

1.Docker是一個容器化平台,它以容器的形式將您的應用程序及其所有依賴項打包在一起,以確保您的應用程序在任何環境中無縫運行。沒有環境不一致的情況,我這能用,你那用不了。類似於發布一個app.

2.Docker鏡像是Docker容器的源代碼,Docker鏡像用於創建容器。使用build命令創建鏡像。

3.Docker容器包括應用程序及其所有依賴項,作為操作系統的獨立進程運行。

4.Docker容器:四種狀態:運行、已暫停、重新啟動、已退出。

5.Dockerfile中最常見的指令

FROM:指定基礎鏡像
LABEL:功能是為鏡像指定標簽
RUN:運行指定的命令
CMD:容器啟動時要運行的命令

6.docker常用命令

docker pull 拉取或者更新指定鏡像
docker push 將鏡像推送至遠程倉庫
docker rm 刪除容器
docker rmi 刪除鏡像
docker images 列出所有鏡像
docker ps 列出所有容器

  7. 容器與主機之間的數據拷貝命令: 主機到容器:docker cp /www 96f7f14e99ab:/www/

  8. 啟動nginx容器(隨機端口映射),並掛載本地文件目錄到容器html的命令

      docker run -d -P --name nginx2 -v /home/nginx:/usr/share/nginx/html nginx

  9. 解釋一下dockerfile的ONBUILD指令

dockerfile是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。

當鏡像用作另一個鏡像構建的基礎時,ONBUILD指令向鏡像添加將在稍后執行的觸發指令。如果要構建將用作構建其他鏡像的基礎的鏡像(例如,可以使用特定於用戶的配置自定義的應用程序構建環境或守護程序),這將非常有用

  10. Docker Swarm是Docker的本機群集。它將Docker主機池轉變為單個虛擬Docker主機。Docker Swarm提供標准的Docker API,任何已經與Docker守護進程通信的工具都可以使用Swarm透明地擴展到多個主機。

  11. 如何在生產中監控Docker

      Docker提供docker stats和docker事件等工具來監控生產中的Docker。我們可以使用這些命令獲取重要統計數據的報告。

Docker統計數據:當我們使用容器ID調用docker stats時,我們獲得容器的CPU,內存使用情況等。它類似於Linux中的top命令。
Docker事件:Docker事件是一個命令,用於查看Docker守護程序中正在進行的活動流。
一些常見的Docker事件是:attach,commit,die,detach,rename,destroy等。我們還可以使用各種選項來限制或過濾我們感興趣的事件

Linux

基本上都是一些面試常問到的題目

1、說一些你比較常用linux指令

  1.1、ls/ll、cd、mkdir、rm-rf、cp、mv、ps -ef | grep xxx、kill、free-m、tar -xvf file.tar、(說那么十幾二十來個估計差不多了)

2、查看進程(例:如何查看所有xx進程)

  2.1、ps -ef | grep xxx

  2.2、ps -aux | grep xxx(-aux顯示所有狀態)

3、殺掉進程

  3.1、kill  -9[PID]    ---(PID用查看進程的方式查找)

4、啟動/停止服務

  4.1、cd到bin目錄cd/

  4.2、./startup.sh   --打開(先確保有足夠的權限)

  4.3、./shutdown.sh  ---關閉

5、查看日志

  5.1、cd到服務器的logs目錄(里面有xx.out文件)

  5.2、tail -f xx.out  --此時屏幕上實時更新日志。ctr+c停止

  5.3、查看最后100行日志 tail -100 xx.out 

  5.4、查看關鍵字附件的日志。如:cat filename | grep -C 5 '關鍵字'(關鍵字前后五行。B表示前,A表示后,C表示前后) ----使用不多

  5.5、還有vi查詢啥的。用的也不多。

6、查看端口:(如查看某個端口是否被占用)

  6.1、netstat -anp | grep 端口號(狀態為LISTEN表示被占用)

7、查找文件

  7.1、查找大小超過xx的文件: find . -type f -size +xxk  -----(find . -type f -mtime -1 -size +100k -size-400k)--查區間大小的文件

  7.2、通過文件名:find / -name xxxx    ---整個硬盤查找

  其余的基本上不常用

8、vim(vi)編輯器  

  有命令模式、輸入模式、末行模式三種模式。
  命令模式:查找內容(/abc、跳轉到指定行(20gg)、跳轉到尾行(G)、跳轉到首行(gg)、刪除行(dd)、插入行(o)、復制粘貼(yy,p)
  輸入模式:編輯文件內容
  末行模式:保存退出(wq)、強制退出(q!)、顯示文件行號(set number)
  在命令模式下,輸入a或i即可切換到輸入模式,輸入冒號(:)即可切換到末行模式;在輸入模式和末行模式下,按esc鍵切換到命令模式

 

公眾號

1優點

微信用戶量大,開發成本低 ,是一個開放性平台,形成閉環:一站式服務,效益轉化率高

 

2 OAuth2.0認證流程?與微信OAuth2.0認證流程有什么不同?
1)OAuth2.0處理流程
a.獲得用戶許可,得到授權碼code
b.根據code 獲得access token
c.通過access token獲得openid
d.通過access token 和openid調用API,獲得用戶授權信息
2)微信認證流程(將bc合並了)
微信認證只需要獲得用戶許可后,獲得授權碼code,
就可以通過code,同時獲得access token以及用戶的openid,
然后根據access token 和openid調用API,獲得用戶授權信息

 

3 access_token有效時間只有2個小時,並且每天只能請求微信服務器獲取access_token 2000次,該問題是如何處理的?

將acess_token存在數據庫或文件或緩存每隔一定時間(小於7200s即可),再去獲取.

 

4微信有哪九大高級接口

語音識別,客服接口,OAuth2.0網頁授權,生成帶參數二維碼,獲取用戶地理位置,獲取用戶基本信息,獲取關注者列表,用戶分組接口,上傳下載多媒體

 

5 微信支付流程(需要配置微信支付異步通知回調地址)

1.用戶在商戶APP中選擇商品,提交訂單,選擇微信支付

2. 商戶后台收到用戶支付單,調用微信支付統一下單接口

3. 統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP

4. 商戶APP調起微信支付

5. 商戶后台接收支付通知(小程序沒有支付異步通知回調地址)

 

小程序

1你使用過哪些方法,來提高微信小程序的應用速度

提高頁面加載速度

減少默認data的大小

組件化方案

 

2優勢

無需下載,通過搜索和掃一掃就可以打開。

良好的用戶體驗:打開速度快。

安卓上可以添加到桌面。

為用戶提供良好的安全保障。小程序的發布,微信擁有一套嚴格的審查流程,不能通過審查的小程序是無法發布到線上的。

劣勢:

限制較多。頁面大小不能超過2M

樣式單一。小程序的部分組件已經是成型的了,樣式不可以修改

推廣面窄,不能分享朋友圈,只能通過分享給朋友,附近小程序推廣。其中附近小程序也受到微信的限制。

 

3原理

微信小程序采用JavaScript、WXML、WXSS三種技術進行開發,JavaScript的代碼是運行在微信App中的,WXML只能使用微信提供的現有標簽,

微信的架構,是數據驅動的架構模式,它的UI和數據是分離的,所有的頁面更新,都需要通過對數據的更改來實現。

小程序分為兩個部分webview和appService。其中webview主要用來展現UI,appService用來處理業務邏輯、數據及接口調用。它們在兩個進程中運行,通過系統層JSBridge實現通信,實現UI的渲染、事件的處理

 

 4簡述下 wx.navigateTo()wx.redirectTo()wx.switchTab()wx.navigateBack()wx.reLaunch()的區別 

wx.navigateTo():保留當前頁面,跳轉到應用內的某個頁面。但是不能跳到 tabbar 頁面

wx.redirectTo():關閉當前頁面,跳轉到應用內的某個頁面。但是不允許跳轉到 tabbar 頁面

wx.switchTab():跳轉到 TabBar 頁面,並關閉其他所有非 tabBar 頁面

wx.navigateBack()關閉當前頁面,返回上一頁面或多級頁面。可通過 getCurrentPages() 獲取當前的頁面棧,決定需要返回幾層

wx.reLaunch():關閉所有頁面,打開到應用內的某個頁面

轉載請標注來源-已哥們經有把我的面試總結,弄到自己網站里,換取打賞了,無語。。。。。。

  名師大將莫自牢,千軍萬馬避藍貓!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM