我對互聯網汽車的一些思考

理想非常美好,現實不確定性很多,唯有務實工作,埋頭苦幹,用釘釘子的精神,把一個又一個的問題解決,一個又一個的難關攻克,不斷夯實技術基礎,不斷積累試驗數據,不斷磨鍊人才隊伍,不斷疊代升級,螺旋發展,才有可能到達勝利的彼岸。

11月16日,以“創新驅動 造福人類——攜手共建網絡空間命運共同體”為主題的第三屆世界互聯網大會在烏鎮開幕,作為參与本屆大會的汽車行業代表,浙江吉利控股集團董事長李書福發表了題為《我對互聯網汽車的一些思考》的署名文章,全文如下:

我對互聯網汽車的一些思考

吉利控股集團董事長 李書福

外行人看熱鬧,內行人看門道。我半路出家,談不上內行,但由於在汽車行業工作幾十年,對所謂的互聯網汽車略有所研究。如果我沒有記錯的話,大概在2007年夏天,有一位中國記者問我:“李總,智能手機改變了傳統電話,在通訊領域發起了一場革命,你認為下一場革命是什麼行業?”我當初回答不出來,我真的不知道是哪個行業。她說:“有人講下一場革命會發生在汽車行業。”

我當初確實沒有想到,也不以為然。當然這位記者也沒有搞清楚這場革命將如何起源,如何發展。而今天,基本上已經有了一個方向,比如電動化、智能化、輕量化,尤其是無人駕駛及人們所謂的互聯網汽車,這些方向在汽車行業內已經被廣泛認同。但如何電動化,電動化程度及水平,如何輕量化,輕量化程度及水平,如何智能化,智能化程度及水平等等問題都沒有標準答案。行業內不同的企業尋求不同的解決方案,大家都在大量投入研發,尤其是在一些基礎技術研發方面的投資是巨大的。

有些技術的研發不僅僅是錢的問題,錢當然重要,但完全靠錢不一定達到目的。比如電動化程度及水平的問題,電動車技術不是新鮮技術,一百多年來一直存在。到今天,有些技術雖然取得了突破,但還有許多技術難題依然找不到解決方案。許多人都說自己的技術世界第一,都說自己的商業模式最有競爭力。但無論怎麼說,汽車電動化這條道路上還有許多困難與問題在等待着我們克服與解決,就是成為“世界第一”了也不一定就能取得成功。

我認為這一場產業革命今天才剛剛開始,離真正的成功還有很大的距離。又比如輕量化的問題,表面上看,電動化與輕量化沒有直接聯繫,但事實上二者關聯非常密切。從商業的本質與產品競爭來講,沒有輕量化就不能電動化,二者密不可分。由於電池的能量密度太低,今天的電動化技術還不能幫助整車解決輕量化的難題,二者是矛盾體。如何解決這個矛盾,全球汽車同行都在做各種嘗試,既要在成本上可行,又要在用戶體驗上有競爭力,雖然已經有了一些科學發明,已經有了一些創新成果,已經有了一些解決方案,在世界各地經常傳來一些神奇的重大技術突破的好消息,但還是需要實踐檢驗。這些檢驗不僅僅是技術可行性,同時還必須要有商業可行性。由於汽車這個產品的特殊性,這種檢驗需要一個漫長而反覆的過程。

探明石油儲量的增加以及全球石油價格的下降,對電動汽車的發展不是好消息,對電動車的成本、經濟性及用戶體驗提出更高要求。由於汽車的電動化與輕量化技術還走在路上,因此我們必須了解行業全貌,共同努力,积極探索,必須明白電動化技術路線存在許多不確定性,需要耐心,切勿急於求成。操之過急可能欲速而不達,只有尊重規律,認清現實,一步一個腳印,循序漸進,才能水到渠成。

互聯網與電動化、輕量化照樣有着先天的關係。汽車工業的發展過程就是工業與信息化技術融合的過程。傳統汽車工業是機電一體化工業,今天的汽車工業是人機、機電、电子信息一體化工業,也就是有些人所謂的互聯網汽車。

所謂互聯網,就是信息技術的網絡化發展,既涉及到汽車本身通訊技術的研發,也涉及到汽車與外部通訊網絡的連接。所謂互聯網汽車,就是把汽車與互聯網有機融合,實現人機交互智能化、機電執行自動化、駕駛路線信息化,最終實現完全無人駕駛,讓汽車成為服務於交通運輸領域的超級機器人。

但是,所有這一切美好追求,都是人們的理想藍圖。什麼時候能夠實現?如何實現?成功率有多高?誰能保證?所有這一切的一切,都需要市場檢驗。理想非常美好,現實不確定性很多,唯有務實工作,埋頭苦幹,用釘釘子的精神,把一個又一個的問題解決,一個又一個的難關攻克,不斷夯實技術基礎,不斷積累試驗數據,不斷磨鍊人才隊伍,不斷疊代升級,螺旋發展,才有可能到達勝利的彼岸。

吉利雖然制定了“藍色吉利行動”計劃,但現在看來需要重新審視,滾動修訂,尤其是美國新一任總統的能源戰略將會對巴黎氣候協定產生影響,從而對汽車行業產生影響,對汽車的電動化進程產生影響。

從理論上講,真正的互聯網汽車必須是高度電動化的汽車,沒有電動化就很難實現互聯網化,也就不可能高度智能化。原因很簡單,電動化有利於能源供給自動化、車輛啟停安全性及長時間待機網絡化的在線服務,但是從此岸到彼岸不能簡單跨越發展,也無法跨越發展,必須按規律發展。

沃爾沃新一代XC90是全球第一輛真正意義上的互聯網概念汽車

有想法的人很多,把想法變成現實卻非常艱難。十多年前沃爾沃就開始研究無人駕駛汽車、電動汽車及輕量化技術。去年沃爾沃XC90新一代車型在全球同步投放市場,其受歡迎程度完全出乎人們的想象,尤其在美國、德國、日本等市場更是供不應求,一車難求,一年內在全球拿了一百多個大獎,這麼一輛沃爾沃XC90,為何如此受歡迎呢?原因有以下幾條:

一、全球第一輛真正意義上的互聯網概念汽車,並且具備持續迭代升級的基礎能力;

二、已經實現0-130公里高度輔助駕駛功能,可以讓司機駕車更加輕鬆;

三、車內空氣質量達到兒童級別標準,不僅過濾了pM2.5,而且確保一氧化氮、一氧化碳、碳氧化合物、甲醛、花粉等各種有害物質得到有效控制;

四、車內音響設計達到歌劇院標準,舉世無雙;

五、安全水平全球遙遙領先;

六、2.0的排氣量油耗,相當於4.0功率、扭矩。

基於可疊代升級的SpA基礎架構開發的沃爾沃XC90,雖然走在行業前列,獲得市場的廣泛認可,但追兵與模仿者也不在少數,其競爭對手紛紛解剖、分析研究XC90,同行開發的類似產品也陸續推向市場,參与競爭。因此,如何更快更好升級疊代,始終擺在汽車行業的面前。

CMA模塊架構具有很強的疊代升級屬性

2013年,吉利歐洲研發中心成立,沃爾沃主導與協同吉利研發CMA基礎架構模塊,這種模塊的最大特點就是靈活、軟硬件都可疊代升級,可以搭載純電、油電、插電,也可以搭載傳統能源,电子架構技術領先,人機交互智能,最終可升級為完全無人駕駛。吉利汽車、沃爾沃汽車兩個汽車公司都可以使用CMA基礎架構模塊進行各自汽車產品的研發設計,雙方的汽車產品標準不同,設計不同,配置不同,消費群體不同。簡單地講,CMA架構就是吉利汽車公司與沃爾沃汽車公司聯合打造的互聯網汽車基礎架構,與傳統汽車底盤概念完全不同。吉利汽車基於CMA基礎架構推出的全新品牌LYNK & CO已於上月在歐洲發布,媒體和消費者給與了高度評價,該品牌下首款車型將於明年第四季度面世。

吉利汽車旗下全新品牌LYNK&CO應互聯網而生

我可以毫不誇張地說,沃爾沃汽車公司的自動駕駛技術是當今世界上最先進的技術,沃爾沃公司研發的XC90、S90汽車產品是全球唯一大批量商業化的高度輔助駕駛汽車,實現了時速0-130公里的智能輔助駕駛。自動駕駛的目的首先是為了安全,無論是電動汽車還是傳統汽車,安全是最基本的前提,這一點全世界沒有第二個汽車公司可以與沃爾沃相抗衡。美國優步與沃爾沃合作開發無人車並由沃爾沃提供基礎車型;全球知名汽車安全零部件公司奧特利夫與沃爾沃合作,聯合研發完全無人駕駛技術等等,都足以說明沃爾沃在無人駕駛技術方面的全球地位。即便這樣,我們依然認為前方的道路充滿了挑戰。

S90已經實現時速0-130公里的智能輔助駕駛

變革是需要條件的,革命是需要環境的。汽車行業的變革雖然已經開始,但條件還需要繼續成熟,環境還需要不斷改善。汽車行業的變革是需要時間的,而且可能反覆並充滿不確定性。理想可以吹得天花亂墜,可以充滿無窮想象,但現實依然殘酷無情。商場就是戰場,眼淚不能解決問題。吉利造汽車是從自己投資建設技師學院及工程師學院開始培養人才的,近二十年來在技師、工程師培養上大量投入。沃爾沃汽車公司雖然做了大量基礎性工作,雖然在汽車及交通領域互聯互通技術上取得了大量研究成果,但以後的路還很長,面臨的挑戰依然非常嚴峻。當然,我們充滿信心,我們堅信,世上無難事,只要肯登攀。

最後,我想用一句千年古訓與大家共勉:“不積跬步,無以至千里;不積小流,無以成江海。”本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

聽說奧迪要找“新歡”?一汽只打算用硬實力說話

前有一汽-大眾奧迪佔盡先機,後有競爭對手環飼左右,前景如何,殊未可知。相比之下,顯然合作已近30年,彼此知根知底的一汽-大眾奧迪更為老練。從率先實現國產、開創軸距加長,到成為第一個突破“百萬”銷量的豪華車品牌,再到如今打出新能源、数字出行服務和未來營銷這三張牌,都掐住了奧迪未來的全球布局,在中國市場佔盡先機。

11月11日,上汽集團與奧迪汽車股份有限公司在德國沃爾夫斯堡簽署合作框架協議,雙方將成立股比對等的合資公司,共同生產和銷售奧迪相關車型。

上汽和奧迪要聯手的消息早已傳得沸沸揚揚,隨着這次緋聞被坐實,關於奧迪“移情別戀”、“紅杏出牆”、“二嫁上汽大眾”等一系列犀利點評便紛至沓來。

然而,就在大家為一汽-大眾奧迪未來處境擔憂的時候,劇情發生了驚天翻轉——首先在11月14日上汽發布與奧迪合作的公告中,上汽最後明確指出該合作事項存在不確定性,請投資者注意風險。可見,未來仍然存在較大變數,上汽和奧迪的聯姻走向如何尚未可知。

其次就在同一天,奧迪鄭重發出與一汽的未來10年合作計劃。雙方將在電動車、移動出行服務和数字化服務及市場銷售等諸多領域展開深入合作。相比於上汽公告的語焉不詳,這份聲明拳拳到肉,明晰直接得多。

如今中國豪華車市場競爭激烈,奧迪為了滿足戰略需求,在華謀求新的合作夥伴,這無可厚非。不過上汽和奧迪將以怎樣的方式合作、又得經歷怎樣的磨合模式都在摸索中,如何落子仍然舉棋不定,然而變化多端絞殺激烈的市場形勢卻未必給他們足夠的摸索時間。前有一汽-大眾奧迪佔盡先機,後有競爭對手環飼左右,前景如何,殊未可知。

相比之下,顯然合作已近30年,彼此知根知底的一汽-大眾奧迪更為老練。從率先實現國產、開創軸距加長,到成為第一個突破“百萬”銷量的豪華車品牌,再到如今打出新能源、数字出行服務和未來營銷這三張牌,都掐住了奧迪未來的全球布局,在中國市場佔盡先機。未來一汽-大眾奧迪還將國產5款奧迪e-tron車型,其中就包括在今年品牌峰會中被提及的續航里程超過500公里的純電動車型。

此外,奧迪也是最早將4S體系引入到中國市場的豪華品牌。一汽-大眾奧迪在華有近400萬用戶,堅實的群眾基礎和體系能力優勢,也是上汽在短期內無法複製的。

所以,對於一汽來說,奧迪即使找了個“新歡”,也根本構不成威脅,最多也就是一種激勵吧。比較,硬實力不是一天能練成的,領先者的地位也不是能被輕易撼動的。總是周遭再彩旗飄飄,家裡這桿指引方向的紅旗依舊屹立不倒。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

17萬起可以買到大切諾基的親弟弟?要趕緊下單了嗎

5牛米。自由俠搭載了7擋雙離合變速箱導致溜坡,並且行駛過程中頓挫不斷,而自由光的9速變速箱則到120km/h也上不了第9擋。因此,對於這兩個動力組合,我持保留意見。配置從配置上來看,全系標配ESC电子穩定控制系統和胎壓監測系統,這點頗為厚道。

前言11月16日,全新指南者正式上市,新車的定位介於自由光與自由俠之間,那麼這款車究竟有什麼特別呢?

售價上入門級的200T指南者在17萬以內,中高配則去到18到20萬區間,200TS高性能四驅版的售價在24萬元左右。從售價上不難看出,指南者完全是對準了合資緊湊型SUV的消費市場,直接競爭對手包括奇駿,CR-V等城市SUV。不過,這個價格段內,可供選擇的車型還是有點少,如果將來可以豐富一下車型選擇,那就挺不錯。

外觀設計

外觀設計上,指南者就是典型的小號大切諾基。長寬高分別為4415x1819x1625mm,而200TS版本的高度會提升到1648mm,軸距則同為2636mm前臉七個鍍鉻矩形框,整齊劃一地置在中心,相當霸氣,給人一種一夫當關,萬夫莫開的感覺。不過,這些矩形框的面積還是小於大切諾基的。

側面則複製了自由光,雖然看上去簡潔,但是一條從A柱沿車窗頂部一直延伸到尾部的鍍鉻裝飾條更顯大氣,梯形輪拱則展現了美國車剛強的一面。在輪轂的造型上,採用了五幅式漏斗形的樣式,看上去比較有力量感。尾部造型也是縮小版的大切諾基,但是由於車身尺寸不夠大, 所以整個造型無法做到很舒展,兩個車燈上方開始有明顯的回收,對乘坐空間有一定影響。

動力總成

全新指南者有兩套動力系統可供選擇分別是1.4T+7速雙離合變速箱和2.4L+9速手自一體變速箱。前者最大輸出165馬力和250牛米,後者最大輸出175馬力和227.5牛米。自由俠搭載了7擋雙離合變速箱導致溜坡,並且行駛過程中頓挫不斷,而自由光的9速變速箱則到120km/h也上不了第9擋。因此,對於這兩個動力組合,我持保留意見。

配置

從配置上來看,全系標配ESC电子穩定控制系統和胎壓監測系統,這點頗為厚道。上到頂配,則多了很多高科技配置,包括自適應定速巡航系統、前碰撞預警制動系統、行駛盲點監測系統、車道偏離預警系統、自動雙方位泊車輔助系統。

從舒適性配置來看,除最低配外,均有電動全景天窗、無鑰匙進入與啟動系統,以及雙區獨立控制空調。另外,全系標配日間行車燈和家人最喜歡的後排座椅出風口,這幾點也誠意十足。

在多媒體方面,全系標配Uconnect智能車載控制系統和語音控制系統,最低配配有5.0英寸中控台彩色显示屏,其餘配置均有8.4英寸的大屏。

作為一輛Jeep,儘管定位於城市SUV,但是一些越野的配置還是不能少的。指南者的頂配車型有Active Drive Low智能四驅系統,並且擁有同級中絕無僅有的低速扭矩放大功能。除此以外,還有五種駕駛模式可供選擇,分別是標準、沙地、泥地、雪地、岩石,全方位滿足各種路況需求。

編者總結:

Jeep近幾年也在慢慢地往市場需求投入更多的精力,然而做出來的產品卻差強人意。可見,在通往優秀家用SUV的路上,Jeep還有不少路要走,但求屬於它的那份野性不會就此丟失。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

台中搬家公司費用怎麼算?

「持續集成實踐系列 」Jenkins 2.x 構建CI自動化流水線常見技巧

在上一篇文章中,我們介紹了Jenkins 2.x實現流水線的兩種語法,以及在實際工作中該如何選擇腳本式語法或聲明式語法。原文可查閱:「持續集成實踐系列」Jenkins 2.x 搭建CI需要掌握的硬核要點(一)

在使用傳統的Jenkins Web界面和項目時,比如自由風格類型的任務,我們對處理流程的控制能力是有限的。所採用的典型形式是任務鏈:任務完成后觸發其他的任務。或者我們可能會包括構建后處理,不管任務成功完成與否,總是去做一些類似發送通知的事情。

除了這些基本的功能外,還可以添加條件性構建步驟插件,通過基於單個或者多個條件的構建步驟來定義更加複雜的流程。但即便如此,相比於我們編寫程序時可以直接控制執行流程的方法,條件性構建步驟插件對流程的控制能力依然有限。

在本篇中,我們將聊一下,關於Jenkins流水線DSL語言所提供的用於控制流水線執行流程基本結構和一些常見技巧。

1. Pipeline流水線指令常見結構

正如在系列第一篇文章中介紹到的,Jenkins DSL採用的是Groovy腳本語言。這也意味着如果當你掌握了Groovy語言,可以按照需求在流水線中使用Groovy語言的結構和習慣用法,針對這一類使用者,通常會更傾向於用腳本式語法來實現流水線。但不管採用的是哪種語法,從流水線組成的角度來講,都是由一些不同指令+步驟構建結構化代碼塊。

對於腳本式流水線,基本結構如下:

node('worker'){
    stage('階段'){
        // DSL
    }
}

構建腳本式流水線常用的結構或者說代碼塊節點主要由nodestage兩個組成。

而,聲明式流水線基本結構構成環節相對要多一些,整理了一張圖如下:

需要劃一個重點:可以簡單理解node是用於腳本式流水線,而agent則是用於聲明式流水線。

Jenkins Pipeline支持的指令(常見):

指令名 說明 作用域
agent 指定流水線或特定階段在哪裡運行。 stage 或pipeline
environment 設置環境變量 stage或pipeline
tools 自動下載並安裝指定的工具,並將其加入到PATH變量中 stage或pipeline
input 暫停pipeline,提示輸入內容 stage
options 用來指定一些預定義選項 stage 或 pipeline
parallel 并行執行多個step stage
parameters 允許執行pipeline前傳入一些參數 pipeline
triggers 定義執行pipeline的觸發器 pipeline
when 定義階段執行的條件 stage
build 觸發其他的job steps

options Jenkins Pipeline常見配置參數:

參數名 說明 例子
buildDiscarder 保留最近歷史構建記錄的數量 buildDiscarder(logRotator(numToKeepStr: ’10’)
timestamps 添加時間戳到控制台輸出 timestamps()
disableConcurrentBuilds 阻止Jenkins併發執行同一個流水線 disableConcurrentBuilds()
retry pipeline發生失敗后重試次數 retry(4)
timeout pipeline運行超時時間 timeout(time:1, unit: ‘HOURS’)

示例:

pipeline{
    agent any
    options{
        buildDiscarder(logRotator(numToKeepStr: '10')
        timestamps()
        retry(3)
        timeout(time:1, unit: 'HOURS')
    }
    stages{
        stage('demo'){
            steps{
                sh 'echo hello'
            }
        }
    }
}

更多pipeline指令,可參見官方介紹:

https://www.jenkins.io/doc/book/pipeline/syntax/#

下述僅挑幾個常用的,用於流水線流程控制選項的指令項,介紹一些常用技巧。

2. 超時(Timeout)

這個timeout步驟允許限制等待某個行為發生時腳本所花費的時間。其語法相當簡單。示例如下:

timeout(time:60,unit:'SECONDS'){
    //該代碼塊中的過程被設置為超時
}

默認的時間單位是min。如果發生超時,該步驟就會拋出一個異常。如果異常沒有被處理,將導致整個流水線過程被中止。

通常推薦的做法是,在使用timeout對任何造成流水線暫停的步驟(如一個input步驟)進行封裝,這樣做的結果是,即使出現差錯導致在限定的時間內沒有得到期望的輸入,流水線也會繼續執行。

示例如下:

node{
    def response
    stage('input'){
        timeout(time:10,unit:'SECONDS'){
            response = input message :'Please Input User'
            parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
        }
        echo "Username = " + response
    }
}

在這種情況下,Jenkins將會給用戶10s做出反應,如果時間到了,Jenkins會拋出一個異常來中止流水線。

如果實際在設計流水線時,當超時發生時,並不想中止流水線向下執行,可以引入try...catch代碼塊來封裝timeout。

如下代碼塊所示:

node{
    def response
    stage('input')
{
      try {
        timeout(time:10,unit:'SECONDS'){
            response = input message :'Please Input User'
            parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
         }
       }
       catch(err){
            response = 'user1'
      }
    }
}

需要注意的是,在處理異常的時候,可以在捕獲異常處設置為期望的默認值。

3. 重試(retry)

這個retry閉包將代碼封底裝為一個步驟,當代碼中有異常發生時,該步驟可以重試n次。其語法如下:

retry(n){
  //代碼過程
}

如果達到重試的限制並且發生了一個異常,那麼整個過程將會被中止(除非異常被處理,如使用try...catch代碼塊)

retry(2){
    try {
       def result=build job: "test_job"
       echo result
      }
    catch(err){
        if(!err.getMessage().contains("UNSTABLE"))
        throw err
    }
}

4. 等待直到(waitUntil)

引入waitUntil步驟,會導致整個過程一直等待某件事發生,通常這裏的“某件事”指的是可以返回true的閉包。

如果代碼過程永不返回true的話,這個步驟將會無期限地等待下去而不會結束。所以一般常見的做法,會結合timeout步驟來封裝waitUntil步驟。

例如,使用waitUntil代碼塊來等待一個標記文件出現:

timeout(time:15,unit:'SECONDS'){
    waitUntil{
        def ret = sh returnStatus:true,script:'test -e /home/jenkins2/marker.txt'
        return (ret==0)
    }
}

再舉一個例子,假如我們要等待一個Docker容器運行起來,以便我們可以在流水線中通過REST API調用獲取一些數據。在這種情況下,如果這個URL還不可用,就會得到一個異常。為了保證異常被拋出的時候進程不會立即退出,我們可以使用try...catch代碼塊來捕獲異常並且返回false。

timeout(time:150,unit:'SECONDS'){
    waitUntil{
        try{
            sh "docker exec ${containerid} curl --silent http://127.0.0.1:8080/api/v1/registry >/test/output/url.txt"
            return true
        }
        catch(err)
            return false
    }
}

5.Stash暫存:實現跨節點文件共享

在Jenkins的DSL中,stashunstash函數允許在流水線的節點間和階段間保存或獲取文件。

基本用法格式:

stash name:"<name>" [includes:"<pattern>" excludes:"<pattern>"]
unstash "<name>"

我們通過名稱或模式來指定一個被包括或被排除的文件的集合。給這些文件的暫存處命名,以便後面通過這個名稱使用這些文件。

提到stash,很多讀者可能會把Jenkins stashGit stash功能弄混,需要說明一下,Jenkins stashGit stash功能是不同的。Git stash函數是為了暫存一個工作目錄的內容,緩存那些還沒有提交到本地代碼倉庫的代碼。而Jenkins stash函數是為了暫存文件,以便在節點間共享。

例如,master節點和node節點,實現跨主機共享文件:

pipeline{
    agent none
    stages{
        stage('stash'){
            agent { label "master" }
            steps{
                writeFile file: "test.txt", text: "$BUILD_NUMBER"
                stash name: "test", includes: "test.txt"
            }
        }
        stage('unstash'){
            agent { label "node" }
            steps{
                script{
                    unstash("test")
                    def content = readFile("test.txt")
                    echo "${content}"
                }
            }
        }
    }
}

如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

CDN百科第三講 | 如果用了雲服務器,還需要做CDN加速嗎?

在全站上雲的背景下,雲計算已經不僅僅是大型互聯網公司的獨享概念,正在被更多的傳統企業、中小企業甚至個人站長所採用。在眾多雲計算服務中,最常見兩個產品就是雲服務器和CDN,今天的CDN百科第三講,就給大家介紹下你關心的問題:如果用了雲服務器,還需不需要做CDN加速?

先上結論:雲服務器和CDN的業務場景不同,並不能彼此替代,同時,它們可以互相補充已達到提升效率的目的。

相對於傳統服務器,雲服務器以簡單高效、安全可靠、處理能力可彈性伸縮的計算形態為用戶提供服務,有助於降低用戶的企業IT成本,提升運維效率。雲計算髮展至今,雲服務器作為基礎服務受到了眾多企業和站長的歡迎,用於部署企業官網網站、資訊門戶、電商應用、辦公系統等等,承載數據。通常針對不同的業務場景,會有不同規格、價位、性能的雲服務器可供選擇。

CDN全稱Content Delivery Network,即內容分髮網絡,它是指將源站內容分發至最接近用戶的節點服務器,使用戶可就近取得所需內容,提高用戶訪問的響應速度和成功率。解決因分佈、帶寬、服務器性能帶來的訪問延遲問題,適用於站點加速、音樂、圖片、文件、點播、直播、應用程序等內容的加速分發。

我們就拿618促銷背後的物流體系來舉例,服務器源站就相當於某品牌自己的貨倉,而CDN就像分佈於各地的倉儲物流點。

現在很多品牌都會預先在各地倉儲物流點,提前儲備一些常用的商品(靜態文件使用CDN進行緩存),當用戶從電商平台下單購買貨物的時候(用戶發起請求),平台根據用戶的收穫地址就近匹配到最近的倉儲物流點並直接進行派貨(就近分發),讓用戶以最快的速度拿到快遞包裹(分發的內容)。我們可以用實際的生活經驗來做個對比,如果從江浙滬包郵區寄給杭州的用戶,一般第二天就能到,如果是從北京、深圳發貨,一般需要2-3天!

這種方案還能避免所有訂單都從單一貨倉發貨爆倉的風驗,當就近的貨倉物流比較繁忙時,則智能匹配其它就近的貨倉進行分流,可以減少包裹全部由總倉(源站服務器)發貨到各地的運輸(帶寬)成本。另外,採用共享的倉儲物流點(CDN)模式也可以完美地根據銷售需求來調整倉儲規模和方案,避免自建貨倉(多地雲服務器)后在業務高峰后的資源閑置浪費。

所以,降低延時,提高穩定性,降低帶寬成本,彈性靈活,都是使用CDN的好處。除此之外,CDN還可以:

第一,降低服務器帶寬壓力

假如你的服務器同時支持1000人在線,那麼當超過1000人訪問的時候,你的網站就會出現訪問瓶頸,延時、卡頓甚至宕機問題接踵而至。在使用CDN后,CDN可以將網站的靜態內容緩存在邊緣節點上,這樣當用戶訪問靜態資源時候就不用再請求回源服務器了,以此減少服務器的帶寬峰值。

第二,保護源站服務器

由於CDN的分佈式架構,用戶通過訪問就近邊緣節點獲取內容,通過這樣的跳板,有效地隱藏源站IP,從而分解源站的訪問壓力。當大規模惡意攻擊來襲時,CDN也可以做為第一道防線進行防護,大大分散攻擊強度,即使是針對動態內容的的惡意請求,CDN的智能調度系統還可以卸載源站服務器的壓力,維護系統平穩。

相信看過這篇文章后,再有人問你:使用雲服務器之後到底要不要再用CDN,你應該會有答案了吧。

往期回顧

CDN百科第一講,最近你的APP崩了嗎?

CDN百科第二講,假如沒用CDN,網絡世界會變成什麼樣?

【CDN百科】專欄中,我們會不斷科普CDN知識,解讀CDN實踐,分享CDN案例,如果你也關注CDN、使用CDN,請留言回復你關心的話題,說不定會被翻牌子哦~~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

【大廠面試04期】講講一條MySQL更新語句是怎麼執行的?

在面試中,經常會問到在MySQL中一條更新語句是怎麼執行的?在本文中,我們就來詳細學習一下更新語句的執行流程,也有利於我們在工作中更好地使用MySQL。

流程圖

這是在網上找到的一張流程圖,寫的比較好,大家可以先看圖,然後看詳細閱讀下面的各個步驟。

執行流程:

1.連接驗證及解析

客戶端與MySQL Server建立連接,發送語句給MySQL Server,接收到後會針對這條語句創建一個解析樹,然後進行優化,(解析器知道語句是要執行什麼,會評估使用各種索引的代價,然後去使用索引,以及調節表的連接順序)然後調用innodb引擎的接口來執行語句。

2.寫undo log

innodb 引擎首先開啟事務,對舊數據生成一個UPDATE的語句(如果是INSERT會生成UPDATE語句),用於提交失敗后回滾,寫入undo log,得到回滾指針,並且更新這個數據行的回滾指針和版本號(會設置為更新的事務id)。

3.從索引中查找數據

根據查詢條件去B+樹中找到這一行數據(如果是唯一性索引,查到第一個數據就可以了(因為有唯一性約束),如果是普通索引,會把所有數據查找出來。)

4.更新數據

首先判斷數據頁是否在內存中?

4.1 如果數據頁在內存中

先判斷更新的索引是普通索引還是唯一性索引?

4.1.1 普通索引

如果更新的索引是普通索引,直接更新內存中的數據頁

4.1.2 唯一性索引

如果更新的索引是唯一性索引,判斷更新后是否會破壞數據的唯一性,不會的話就更新內存中的數據頁。

4.2 如果數據頁不在內存中

先判斷更新的索引是普通索引還是唯一性索引?

4.2.1 普通索引

如果是更新的索引是普通索引,將對數據頁的更新操作記錄到change buffer,change buffer會在空閑時異步更新到磁盤。

4.2.2 唯一性索引

如果是更新的索引是唯一性索引,因為需要保證更新后的唯一性,所以不能延遲更新,必須把數據頁從磁盤加載到內存,然後判斷更新后是否會數據衝突,不會的話就更新數據頁。

5.寫undo log(prepare狀態)

將對數據頁的更改寫入到redo log,將redo log設置為prepare狀態。

6.寫bin log(commit狀態),提交事務

通知MySQL server已經更新操作寫入到redo log 了,隨時可以提交,將執行的SQL寫入到bin log日誌,將redo log改成commit狀態,事務提交成功。(一個事務是否執行成功的判斷依據是是否在bin log中寫入成功。寫入成功后,即便MySQL Server崩潰,之後恢復時也會根據bin log, redo log進行恢復。具體可以看看下面的崩潰恢復原則)

補充資料:

二段提交制是什麼?

更新時,先改內存中的數據頁,將更新操作寫入redo log日誌,此時redo log進入prepare狀態,然後通知MySQL Server執行完了,隨時可以提交,MySQL Server將更新的SQL寫入bin log,然後調用innodb接口將redo log設置為提交狀態,更新完成。
如果只是寫了bin log就提交,那麼忽然發生故障,主節點可以根據redo log恢複數據到最新,但是主從同步時會丟掉這部分更新的數據。
如果只是寫binlog,然後寫redo log,如果忽然發生故障,主節點根據redo log恢複數據時就會丟掉這部分數據。
MySQL崩潰后,事務恢復時的判斷規則是怎麼樣的?(以redolog是否commit或者binlog是否完整來確定)
如果 redo log 裏面的事務是完整的,也就是已經有了 commit 標識,則直接提交;

如果 redo log 裏面的事務只有完整的 prepare,則判斷對應的事務 binlog 是否存在並完整:a. 如果是,則提交事務;b. 否則,回滾事務。

undo log是什麼?

undo log主要是保證事務的原子性,事務執行失敗就回滾,用於在事務執行失敗后,對數據回滾。undo log是邏輯日誌,記錄的是SQL。(可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。)
在事務提交后,undo log日誌不會立即刪除,會放到一個待刪除的鏈表中,有purge線程判斷是否有其他事務在使用上一個事務之前的版本信息,然後決定是否可以清理,簡單的來說就是前面的事務都提交成功了,這些undo才能刪除。
change buffer是什麼(就是將更新數據頁的操作緩存下來)
在更新數據時,如果數據行所在的數據頁在內存中,直接更新內存中的數據頁。
如果不在內存中,為了減少磁盤IO的次數,innodb會將這些更新操作緩存在change buffer中,在下一次查詢時需要訪問這個數據頁時,在執行change buffer中的操作對數據頁進行更新。
適合寫多讀少的場景,因為這樣即便立即寫了,也不太可能會被訪問到,延遲更新可以減少磁盤I/O,只有普通索引會用到,因為唯一性索引,在更新時就需要判斷唯一性,所以沒有必要。

redo log 是什麼?

redo log就是為了保證事務的持久性。因為change buffer是存在內存中的,萬一機器重啟,change buffer中的更改沒有來得及更新到磁盤,就需要根據redo log來找回這些更新。
優點是減少磁盤I/O次數,即便發生故障也可以根據redo log來將數據恢復到最新狀態。
缺點是會造成內存臟頁,後台線程會自動對臟頁刷盤,或者是淘汰數據頁時刷盤,此時收到的查詢請求需要等待,影響查詢。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

.Net Core 會逆襲成為最受歡迎開發平台嗎?

本文由葡萄城技術團隊於博客園原創並首發

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

.Net Core 是什麼?

最新.Net Core 熱詞霸佔了各個技術熱搜,看來微軟近年來發布的 .Net Core 還是成功了引起了大家的熱烈討論。如果您對微軟熟悉,肯定是很了解.Net 平台,但是隨着互聯網的興起,好像微軟這個霸主的地位有所撼動。

 

.NET Core 是.NET Framework的新一代版本,是微軟開發的第一個跨平台 (Windows、Mac OSX、Linux) 的應用程序開發框架(Application Framework),未來也將會支持 FreeBSD 與 Alpine 平台。.Net Core也是微軟在一開始發展時就開源的軟件平台[1],由於 .NET Core 的開發目標是跨平台的因此 .NET Core 會包含 .NET Framework 的類別庫,但與 .NET Framework 不同的是 .NET Core 採用包化 (Packages) 的管理方式,應用程序只需要獲取需要的組件即可,與 .NET Framework 大包式安裝的作法截然不同,同時各包亦有獨立的版本線 (Version line),不再硬性要求應用程序跟隨主線版本。

 

重點來啦:

  • 跨平台:可在 Windows、macOS 和 Linux 操作系統上運行
  • 跨體繫結構保持一致:在多個體繫結構(包括 x64、x86 和 ARM)上以相同的行為運行代碼
  • 命令行工具:包括可用於本地開發和持續集成方案中的易於使用的命令行工具。
  • 部署靈活:可以包含在應用或已安裝的并行(用戶或系統範圍安裝)中。 可搭配 Docker 容器使用
  • 兼容性: .NET Core 通過 .NET Standard 與 .NET Framework、Xamarin 和 Mono 兼容
  • 開放源代碼: .NET Core 平台是開放源代碼,使用 MIT 和 Apache 2 許可證。 .NET Core 是一個 .NET Foundation 項目
  • 強勁性能:超強的後台性能,超出.Net Framework
  • 支持命令行執行所有操作

 

.Net Core 當前的現狀是什麼

目前可以看到很多傳統行業的信息系統也在逐漸升級平台,而且很多大的互聯網公司也已經使用,畢竟一次開發即可實現跨平台的部署及應用,也是減少成本的重要體現。

 

可以確定.Net Core 是未來的發展趨勢。 .Net FrameWork也會延續使用,畢竟短期內遷移一些大型項目是很有難度的,而且也不太可能。.Net Core 和.Net FrameWork 的關係就如同是新能源汽車和傳統穩定的油耗汽車。油耗汽車已經經歷了多年的發展,技術非常成熟穩定,可以放心自由的使用。而新能源汽車是一個新興的技術,也是未來將要取待傳統技術的未來發展方向,所以使用.Net Core 開發項目必須越早越好。

 

.Net Core 與. Net FrameWork 對比:

.NET Core

.NET Framework

跨平台 (OS platform): 支持Windows, Linux, 及 macOS

僅支持在 Windows運行

安裝過程是獨立,端對端,可以在同一計算器中為應用程序指定獨立的.Net Core 版本。

一台計算機上的所有應用程序都在同一.NET Framework版本上運行

高性能:在集合,數學,正則表達式,字符串,文件等方面都有提升。.

高兼容性

開源: 基於.NET平台既可以根據 MIT或 Apache 2 授權

與最廣泛的NuGet軟件包,第三方庫和內部庫兼容

v2.0 實現了.NET Standard 2.0¹

v4.6.1+ 以上版本支持s .NET Standard 2.0

 

使用.Net Core 優勢:

1. 支持在任何平台部署,跨平台幾乎沒有任何成本

2. 龐大的.Net 標準庫支持

3. 面向高性能的服務器開發,基於 微軟 Azure雲的平台優勢,已提供高性能的服務。

4. 高性能和可移植性

5. 兼容多平台

 

如何平滑的遷移項目至.Net Core 平台

很多原有的項目是基於.Net FrameWork 開發的,可能是 Windows. WPF, ASP.NET MVC,那本身的局限是只能在Windows系統部署外,還涉及到一些核心功能的實現。傳統框架的種種不足,需要大的突破和改變。這意味着打破變化,但結果是值得期待的。

 

遷移原有項目到新的.Net Core 平台意味着你可以保留舊項目的所有核心業務功能,不需要重構整個項目,從0開始開發。以下是我們根據經驗給出了幾類的應用的遷移難度。

項目類型

遷移難易程度

Web 應用: ASP.NET MVC

簡單

WebForm 應用

不建議遷移,因為.Net Core 支持 WebForm

Windows 應用 (Universal Framework)

不需要遷移

Windows 應用(基於Sliverlight)

簡單

WPF 及WinForms 桌面應用

複雜

控制台應用

簡單

 

1. 遷移還是重構

如果針對前端項目,遷移是最佳選擇,畢竟前端代碼均可復用,唯一要改動的就是後端代碼。儘管.Net Core 和.Net Frame Work 項目都是基於C# 語言做開發的,然而兩者是不同的運行機制。所以如果是後端很重的項目,還是建議重寫,這樣也會利用一些新技術的優勢。

 

2. NuGet 包

在遷移之前,需要確認引用的.Net 標準庫是否在.Net Core中支持或丟棄,如果不支持的話,就需要考慮如何用新的包代替或者當前功能的重構。

.Net 標準包是在.Net 4.6.1 和.Net Core 中都可使用的,所以只需要可以使用該技術升級舊的PCL。如果你添加了.Net 標準庫的引用,同樣也可以在.Net Core 項目中使用。

 

3. Html / JavaScript / CSS 復用

可以將這些文件直接複製到.NET Core解決方案中。 但是,請確保更改代碼中的文件路徑,例如CSS中的圖像路徑。 因為經典的ASP.NET / MVC模板使用“ / Content /”目錄,而.NET Core使用“ / css /”,“ / js /”,“ / lib /”等。對此沒有任何限制,它們只是約定而已 。

 

如何選擇.Net Core 的開發工具

在開發項目時候,新的平台和技術總是帶給你項目的一些新的重大突破功能,比如性能,比如核心功能提升,所以不僅我們的項目要一直跟隨升級,我們所選擇的開發工具,也要緊跟技術前沿,甚至要領先於我們的項目升級進度,為我們開發項目始終提供最有力的技術支持。

 

.NET Core是多平台應用程序的未來。 如我們所見,.NET Core提供了傳統框架不支持的強大的本機新功能。 另一方面,.NET Core並不完全支持所有現有的應用程序類型進行遷移,尤其是那些與Windows OS緊密集成的應用程序類型,因此必須仔細考慮並計劃這些挑戰。

 

所以我們在選擇新平台的同時,也需要考慮一些輔助開發的工具。以及這些工具在該領域的技術背景,是否足夠穩定,是否有足夠明確的未來,甚至比我們更能預先跟蹤未來的技術棧,以始終在我們遷移新項目的時候提供輔助工具。

 

這裏推介一些支持.Net Core 平台的開發控件:

  • API Protability Tool。這是一款輔助.net開發者在不同的開發框架上遷移源代碼工程的靜態代碼審查工具。由於.net framework具有多個歷史版本,並且.net core以及Xamarin等開發框架在基礎類庫中實現API數量和類型有很多的不一致情況。.net開發者想把自身源代碼升級到更高的.net版本或者遷移到其他的.net開發框架上,會面臨很多API調用不兼容的問題。該工具就是幫助.net開發者審查.net項目的源代碼,並生成審查報告,快速幫助開發人員找到不兼容代碼行以及協助評估遷移工作量。
  • PostMan,Postman是一款支持跨平台的應用程序,用來幫助開發者快速構建和測試REST API 服務。Postman可以模擬HTTP請求的所有謂詞,用於REST API的測試。
  • Visual Studio Code , Visual Studio Code是跨操作系統平台的輕量級代碼編輯器。支持絕大多數主流語言編譯和調試的能力。
  • ActiveReports .Net 報表控件,專註報表領域20餘年,所以可見專業性以及對於.Net 技術的完善的集成技術,支持最新的ASP.Net Core MVC (.Net Core)項目的開發。可快速解決.Net Core 平台的報表設計,展示,打印/導出,數據鑽取等功能,與此也提供了最終用戶免費設計器(在線/桌面端)解決部署差異的難題。
  •  

     

  • Wyn Enterprise 嵌入式商業智能和報表軟件,基於.NET Core平台,可以以白標的方式嵌入到應用系統中,快速增強應用系統的自助式分析、移動BI、數據可視化、報表統計和數據填報等功能,最終用戶在業務系統中便能通過數據分析,為決策制定提供數據支撐。

  •  

     

     

 

綜上所述,無論從其性能和生態上預測,.NET Core 都極有可能成為最受歡迎的開發平台,不過,當前國內僅有騰訊、阿里等廠家願意試水,葡萄城作為一家具備30多年開發經驗的軟件廠商,同樣也在持續對.NET控件進行更新迭代。

如果您有 .NET Core及其衍生技術和開發工具的需求,請訪問葡萄城官網了解詳情。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

MongoDB 4.X CRUD基本操作

本文總結了MongoDB 4.X在mongo shell客戶端涉及的對文檔一些基本的增刪改查操作,即CRUD操作。主要結合了自己平時使用MongoDB的操作命令,更詳細的命令可以參考官方文檔: https://docs.mongodb.com/manual/crud/

創建(Create Operations)

創建(Create Operations)也叫插入操作,當集合不存在時,插入操作同時也會創建集合。MongoDB提供以下幾種插入文檔方法:

  • db.collection.insert():在指定集合中插入單個或多個文檔。
  • db.collection.insertOne():在指定集合中插入單個文檔(版本3.2新增)。
  • db.collection.insertMany():在指定集合中插入多個文檔(版本3.2新增)。

db.collection.insert()

在平時的使用當中,db.collection.insert()是我用得最多的文檔插入方式,具體的語法格式如下:

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)

參數說明:

  • document:指定一個或多個文檔;
  • writeConcern:文檔寫入確認級別(可選),關於讀寫策略確認級別,以後再進行討論;
  • ordered:指定文檔是否按順序插入(可選),默認為true;
    • 當指定為true時,插入多個文檔時將文檔排序保存在一個數組中進行插入,如果其中有一個文檔插入失敗,則會導致數組中餘下的文檔不進行插入操作;
    • 當指定為false時,插入多個文檔時將文檔不進行排序保存在一個數組中進行插入,如果其中有一個文檔插入失敗,則不影響數組中餘下的文檔進行插入操作。

如果插入的文檔當中沒有指定_id字段,則MongoDB會自動為文檔生成具有唯一ObjectId值的字段_id

使用示例:

// 沒有指定_id字段的插入單個文檔
db.products.insert( { item: "card", qty: 15 } );

// 指定_id字段的插入單個文檔
db.products.insert( { _id: 10, item: "box", qty: 20 } );

// 插入多個文檔,不進行排序,多個文檔包含在數組[]中
db.products.insert(
   [
     { _id: 11, item: "pencil", qty: 50, type: "no.2" },
     { item: "pen", qty: 20 },
     { item: "eraser", qty: 25 }
   ]
);

// 插入多個文檔,並進行排序
db.products.insert(
   [
     { _id: 20, item: "lamp", qty: 50, type: "desk" },
     { _id: 21, item: "lamp", qty: 20, type: "floor" },
     { _id: 22, item: "bulk", qty: 100 }
   ],
   { ordered: false }
);

db.collection.insertOne()

語法格式如下:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

參數說明:

參考db.collection.insert()的參數說明。

使用示例:

// 單行插入文檔,關於_id字段指定與否也與db.collection.insert()一致
db.products.insertOne( { item: "card", qty: 15 } );

db.collection.insertMany()

語法格式如下:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

參數說明:

參考db.collection.insert()的參數說明。

使用示例:

參考db.collection.insert()的參數說明。

關於返回確認信息

db.collection.insert()在插入文檔成功之後返回的信息相對較為簡潔:

db.products.insert( { item: "card", qty: 15 } );
WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })

db.collection.insertOne()db.collection.insertMany()返回的信息較為詳細:

db.products.insertOne( { item: "card", qty: 15 } );
{
    "acknowledged": true,
    "insertedId": ObjectId("5eccbd214139000074003be8")
}

db.products.insertMany( [
      { _id: 10, item: "large box", qty: 20 },
      { _id: 11, item: "small box", qty: 55 },
      { _id: 12, item: "medium box", qty: 30 }
   ] );
{
    "acknowledged": true,
    "insertedIds": [
        10,
        11,
        12
    ]
}

查詢(Read Operations)

查詢(Read Operations)讀操作,是對集合中已存在的文檔進行查詢,即對應關係型數據庫當中的select操作,比如MySQL,MongoDB提供以下幾種主要查詢文檔方法:

  • db.collection.find():查詢指定集合中滿足條件的一個或多個文檔和視圖;
  • db.collection.findOne():查詢指定集合中滿足條件的第一個文檔,並以格式化方式展現,通過pretty()方法。

來自官方文檔的測試數據:

db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

db.collection.find()

db.collection.find()可以說是使用頻率最高的方法了,可以用來查詢數據庫集合當中的文檔。

語法格式如下:

db.collection.find(<query>, <projection>)
  • query:查詢表達式;
  • projection:指定查詢結果集中需要显示的字段。
    • Col_name:1|true 代表显示該字段;
    • Col_name:0 | false 代表不显示該字段。

_id字段是默認显示的,如果不想显示,則顯式指定{"_id" : 0}

查詢所有文檔:

db.inventory.find()

db.inventory.find({})

db.collection.findOne()

db.collection.findOne()方法显示符合條件查詢的第一條文檔,接受的參數與db.collection.find()方法一致。

條件查詢操作符

通常對文檔的查詢,是需要帶條件的,而很少使用到不帶條件的全文檔檢索,以下總結了幾種常使用的查詢操作符:

比較操作符

比較操作符涉及的操作如下錶所示:

名稱 說明
$eq 與指定值相等
$gt 大於指定的值
$gte 大於或等於指定的值
$in 指定的值在數組中
$lt 小於指定的值
$lte 小於或等於指定的值
$ne 所有不等於指定的值
$nin 指定的值不在數組中

使用示例:

// $eq:等值查詢 SQL: SELECT * FROM inventory WHERE status = "D";
db.inventory.find( { status: "D" } )

// $ne 同$eq

// $gt:範圍查詢(以大於為例) SQL: SELECT * FROM inventory WHERE qty > 30;
db.inventory.find( { qty: { $gt: 30 } } )

// $gte、$lt、$lte 同$gt

// $in:或查詢,可使用or代替 SQL: SELECT * FROM inventory WHERE status in ("A", "D")
db.inventory.find( { status: { $in: [ "A", "D" ] } } )

// $nin 同$in

邏輯操作符

邏輯操作符涉及的操作如下錶所示:

名稱 說明
$and 指定查詢同時滿足多個條件查詢子句
$not 指定查詢不滿足條件查詢子句
$nor 指定查詢無法滿足多個條件查詢子句
$or 指定查詢滿足其中某個條件查詢子句

使用示例:

// $and: 邏輯與查詢 SQL: SELECT * FROM inventory WHERE status = "A" AND qty < 30;
db.inventory.find( { $and: [ { status: { $eq: "A" },  qty: { $lt: 30 } } ] } )

// $not: 不符合查詢 SQL: SELECT * FROM inventory WHERE status <> "A";
db.inventory.find( { status: { $not: { $eq: "A" } } } )

/*
$nor: 無法同時滿足多個條件查詢,字段不存在時也符合 SQL: SELECT * FROM inventory WHERE status <> "A" AND qty > 30; 
符合以下條件之一都會出現在結果集中:
1.文檔包含status和qty字段並且符合條件;
2.文檔包含status字段並且符合條件,不包含qty字段;
3.文檔不包含status字段,包含qty字段並且符合條件;
4.文檔不包含status字段和qty字段。
*/
db.inventory.find( { $nor: [ { status: { $eq: "A" } },  { qty: { $lt: 30 } } ] } )

// $or: 邏輯或查詢 SQL: SELECT * FROM inventory WHERE status = "A" OR qty < 30;
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

元素操作符

元素操作符主要涉及的操作如下錶所示:

名稱 說明
$exists 指定查詢文檔是否有對應的字段
$type 指定查詢文檔的某個字段是否是對應類型

使用示例:

// $exists: 是否存在指定字段查詢
db.inventory.find( { price: { $exists: true } } )

// $type: 字段是否是指定類型查詢
db.inventory.find( { "qty": { $type: "double" } } )

評估操作符

評估操作符主要涉及的操作如下錶所示,更多操作符可以參考官方文檔:https://docs.mongodb.com/manual/reference/operator/query-evaluation/

名稱 說明
$expr 為同一個文檔中的字段指定表達式並且符合條件的查詢,比如比較同一文檔當中兩個字段的值
$mod 為字段值取模並且符合條件的查詢

為了更好的使用這兩個主要的操作符,額外創建個文檔:

db.monthlyBudget.insertMany([
    { "_id" : 1, "category" : "food", "budget": 400, "spent": 450 },
    { "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 },
    { "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 },
    { "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 },
    { "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
]);

使用示例:

// $expr: 允許使用聚合表達式,這裏以$gt為例,更多表達式參考 https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )

// $mod: 對字段所在值進行取模運算,显示符合條件的查詢,如qty字段值對4取模,並且餘數為0
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )

更新(Update Operations)

更新(Update Operations)是對已存在的文檔進行修改操作,MongoDB提供以下幾種主要更新文檔方法:

  • db.collection.update():更新或替換集合中符合條件的一個或多個文檔;
  • db.collection.updateOne():只更新集合中符合條件的第一個文檔,即使有多個文檔(版本3.2新增);
  • db.collection.updateMany():更新集合中所有符合條件的文檔(版本3.2新增)。

db.collection.update()

根據update指定的表達式可以修改文檔中符合條件的字段或代替整個文檔。具體的語法格式如下:

db.collection.update(
   <query>,   //查詢表達式
   <update>,  //更新表達式
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>                   // 版本4.2新增
   }
)

參數說明:

  • query:更新文檔的查詢表達式;如果指定了參數upsert: true並且集合中沒有符合查詢條件的文檔,查詢條件中有關於字段_id指定了.分隔符的,並不會插入新的文檔;

  • update:主要包含三種格式

    • 1.更新文檔:只包含更新操作符表達式;
    • 2.替換文檔:只包含<field1>: <value1>對;
    • 3.聚合管道:版本4.2新增,詳細參考官方文檔。
  • upsert:當query查詢條件沒符合更新的文檔,就新創建文檔(可選),默認值為false

  • multi:是否更新多個符合條件的文檔(可選),默認值為false,只更新符合條件的第一個文檔;

  • writeConcern:參考db.collection.insert()相同參數說明;

  • collation:指定校對規則(可選,版本3.4新增);

  • arrayFilters:文檔數組更新過濾操作符(可選,版本3.6新增);

    詳細參考:https://docs.mongodb.com/manual/reference/method/db.collection.update/#specify-arrayfilters-for-array-update-operations

  • hint:採用文檔或字符串的形式指定適用於查詢表達式的索引,如果索引不存在則報錯(可選,版本4.2新增)。

使用示例:

使用示例將通過使用兩種場景進行,一是沒有使用參數選項upsert,二是使用參數選項upsert

  • 不使用選項upsert
// 測試數據
db.books.remove({});

db.books.insertMany([
  {
    "_id" : 1,
    "item" : "TBD",
    "stock" : 0,
    "info" : { "publisher" : "1111", "pages" : 430 },
    "tags" : [ "technology", "computer" ],
    "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
    "reorder" : false
   },
   {
    "_id" : 2,
    "item" : "XYZ123",
    "stock" : 15,
    "info" : { "publisher" : "5555", "pages" : 150 },
    "tags" : [ ],
    "ratings" : [ { "by" : "xyz", "rating" : 5 } ],
    "reorder" : false
   }
]);


/* 使用選項參數 upsert: true
1、如果查詢表達式找到匹配的文檔,則執行更新操作;
2、如果查詢表達式沒有找到匹配的文檔,則執行插入操作;
*/
db.books.update(
   { item: "ZZZ135" },   // 查詢表達式
   {                     // 更新或替換文檔
     item: "ZZZ135",
     stock: 5,
     tags: [ "database" ]
   },
   { upsert: true }
);

// 1.使用更新操作表達式
/* $set操作符
1、查詢表達式指定需要更新的文檔 _id;
2、$inc操作符: stock的字段值+5;
3、$set操作符: 替換item字段值,替換嵌入文檔info的publisher字段值,替換tags字段值,替換數組ratings的第二個元素值
*/
db.books.update(
   { _id: 1 },
   {
     $inc: { stock: 5 },
     $set: {
       item: "ABC123",
       "info.publisher": "2222",
       tags: [ "software" ],
       "ratings.1": { by: "xyz", rating: 3 }
     }
   }
);
更新之後的文檔:
{

  "_id" : 1,
  "item" : "ABC123",
  "stock" : 5,
  "info" : { "publisher" : "2222", "pages" : 430 },
  "tags" : [ "software" ],
  "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
  "reorder" : false
}

// 2.為已存在的數組添加元素
// $push操作符: 為指定文檔數組ratings添加一個元素
db.books.update(
   { _id: 2 },
   {
     $push: { ratings: { "by" : "jkl", "rating" : 2 } }
   }
);
更新之後的文檔:
{
  "_id" : 2,
  "item" : "XYZ123",
  "stock" : 15,
  "info" : {
   "publisher" : "5555",
   "pages" : 150
  },
  "tags" : [ ],
  "ratings" : [
   { "by" : "xyz", "rating" : 5 },

   { "by" : "jkl", "rating" : 2 }

  ],
  "reorder" : false
 }

// 3.文檔移除字段
// $unset操作符: 移除文檔的指定字段,為_id:1文檔移除tags字段
db.books.update( { _id: 1 }, { $unset: { tags: 1 } } );
更新后的文檔:
{
  "_id" : 1,
  "item" : "TBD",
  "stock" : 0,
  "info" : {
   "publisher" : "1111",
   "pages" : 430
  },
  "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
  "reorder" : false
 }

// 4.替換整個文檔
// 替換_id:2的文檔
db.books.update(
   { _id: 2 },
   {
     item: "XYZ123",
     stock: 10,
     info: { publisher: "2255", pages: 150 },
     tags: [ "baking", "cooking" ]
   }
);
更新后的文檔:
{
   "_id" : 2,
   "item" : "XYZ123",
   "stock" : 10,
   "info" : { "publisher" : "2255", "pages" : 150 },
   "tags" : [ "baking", "cooking" ]
}

// 5.更新多個文檔
db.books.update(
   { stock: { $lte: 10 } },
   { $set: { reorder: true } },
   { multi: true }
);
更新后的全部文檔:
[
  {
    "_id" : 1,
    "item" : "ABC123",
    "stock" : 5,
    "info" : {
     "publisher" : "2222",
     "pages" : 430
    },
    "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],

    "reorder" : true

   }
   {
     "_id" : 2,
     "item" : "XYZ123",
     "stock" : 10,
     "info" : { "publisher" : "2255", "pages" : 150 },
     "tags" : [ "baking", "cooking" ],

     "reorder" : true

   }
]
  • 使用upserts選項
/* 使用選項參數 upsert: true
1、如果查詢表達式找到匹配的文檔,則執行更新操作;
2、如果查詢表達式沒有找到匹配的文檔,則執行插入操作;
*/

// 1.插入未符合更新條件的文檔
db.books.update(
   { item: "ZZZ135" },   
   {                     
     item: "ZZZ135",
     stock: 5,
     tags: [ "database" ]
   },

   { upsert: true }      

);
因為集合併未滿足條件的文檔,則插入的文檔為:
{
  "_id" : ObjectId("5da78973835b2f1c75347a83"),
  "item" : "ZZZ135",
  "stock" : 5,
  "tags" : [ "database" ]
}

// 2.插入未符合更新條件並且基於更新操作符的文檔
// 如果沒有符合更新查詢條件,並且使用的是更新操作符,則會基於當前的查詢條件和更新操作符字段插入新的文檔
db.books.update(
   { item: "BLP921" },   
   {                     
      $set: { reorder: false },
      $setOnInsert: { stock: 10 }
   },
   { upsert: true }      
);
新插入的文檔為:
{
  "_id" : ObjectId("5da79019835b2f1c75348a0a"),
  "item" : "BLP921",
  "reorder" : false,
  "stock" : 10
}

// 3.插入未符合更新條件並且基於聚合管道的文檔
// 關於聚合管道請參考官方文檔:https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-with-aggregation-pipeline

// 4.插入未符合更新條件並且同時聯合多文檔操作符的文檔
如果不符合查詢條件,則只會插入單個文檔
db.books.update(
  { "info.publisher": "Self-Published" },   
  {                                         
    $set: { reorder: false, tags: [ "literature", "hardcover" ], stock: 25 }
  },
  { upsert: true, multi: true }             
);
新插入的文檔:
{
  "_id" : ObjectId("5db337934f670d584b6ca8e0"),
  "info" : { "publisher" : "Self-Published" },
  "reorder" : false,
  "stock" : 25,
  "tags" : [ "literature", "hardcover" ]
}

db.collection.updateOne()

根據update指定的參數可以修改文檔中符合條件的字段或代替整個文檔,與db.collection.update()不同的是每次只更新單個文檔。

語法格式如下:

db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        
   }
)

參數說明:

參考db.collection.update()的參數說明。

使用示例:

// 參考db.collection.update()

db.collection.updateMany()

根據update指定的參數可以修改文檔中符合條件的字段或代替整個文檔,與db.collection.updateOne()不同的是更新所有符合條件的文檔。

語法格式如下:

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        
   }
)

參數說明:

參考db.collection.update()的參數說明。

使用示例:

// 參考db.collection.update()

刪除(Delete Operations)

刪除是指對集合當中已存在的文檔進行清除操作,MongoDB提供以下幾種主要刪除文檔方法:

  • db.collection.deleteOne():只刪除集合中符合條件的一個文檔;
  • db.collection.deleteMany():刪除集合中所有符合條件的文檔;
  • db.collection.remove():刪除集合中符合條件的一個或多個文檔。

db.collection.deleteOne()

根據filter選項條件刪除集合中的單個文檔,具體語法格式如下:

db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

參數說明:

  • filter:指定基於查詢表達式的過濾條件,關於查詢表達式可以查看db.collecion.find()中的<query>
  • writeConcern:參考db.collection.insert()相同參數說明;
  • collation:指定校對規則(可選,版本3.4新增);

使用示例:

// 刪除指定條件的單個文檔
db.orders.deleteOne( { "_id" : 1 } );
{ "acknowledged" : true, "deletedCount" : 1 }

db.collection.deleteMany()

根據filter選項條件刪除集合中的單個文檔,具體語法格式如下:

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

參數說明:

參考db.collection.deleteOne()的參數說明。

使用示例:

// 刪除指定條件的多個文檔
db.orders.deleteMany( {"cust_id" : "Cam Elot"} );
{ "acknowledged" : true, "deletedCount" : 2 }

注意: 如果是對固定集合進行刪除文檔操作則會報錯,固定集合的清除操作使用方法db.collection.drop()

總結

  1. 本文簡單梳理了在Mongo Shell下基本的CRUD操作,主要適用於DBA的運維管理,如果是研發同學,根據不同的編程語言使用不同客戶端驅動進行操作,詳細同樣可以參考官方文檔;
  2. 針對CRUD各個方面還有其他一些額外的方法,比如查詢修改文檔方法db.collection.findAndModify(),這裏只是總結每個文檔操作中一些最基礎的方法,對於額外高級的方法這裏不再贅述;
  3. 掌握了這些基本的CRUD操作,就可以對MongoDB文檔進行操作了,但還是需要控制好權限,畢竟數據安全不是小事,做變更之前做好數據的備份,以防萬一。

參考

https://docs.mongodb.com/manual/crud/

https://docs.mongodb.com/manual/reference/operator/query-evaluation/

https://docs.mongodb.com/manual/reference/method/db.collection.update/#specify-arrayfilters-for-array-update-operations

https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-with-aggregation-pipeline

〖本人水平有限,文中如有錯誤還請留言批評指正!〗

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

Python面試常用的高級用法,怎麼動態創建類?

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是Python專題的第16篇文章,今天我們來聊聊Python當中的元類。

元類是Python當中的高級用法,如果你之前從來沒見過這個術語或者是沒聽說過這個概念,這是非常正常的,因為一方面它的使用頻率不高,另外一方面就是它相對不太容易理解。以至於很多Python開發者都理解得不是很深入,導致了市面上相關的資料也並不太多。我也是讀了一些大牛的代碼才開啟了這扇新世界的大門。

一切都是對象

我們之前的時候曾經介紹過,在Python當中一切都是對象,注意,是一切都是對象。我們都知道對象是類實例化之後的結果,可以簡單地將類和對象類比成模具和成品的關係。模具是類,而根據模具做出來的產品是對象。

這個比喻思想比較接近,但是不完美。因為實際當中一個模具可以做出多個產品,一個產品只有一個模具。但編程語言當中不同,由於類之間可以繼承以及多繼承,也就是說一個對象可以對應多個類。所以這個比喻不是特別合適,但是類和對象的關係是沒錯的。

但是這就有了一個問題,既然Python當中一切都是對象,那麼是不是說類其實也是一個對象呢?也就是說一個模具其實也是另外一個模具的產品?同樣,這個模具的模具其實也是另外一個模具的產品,那麼我們一直追問下去會怎麼樣呢?

很簡單,我們做個實驗就知道了,我們可以用_class__關鍵字來查看一個變量的類型,那麼我們反覆調用就可以查看其中的關係了:

從上面的圖中我們可以發現,num是int類型的變量。我們繼續查看int這個類型的類型,得到了type類型。而當我們去查看type的類型的時候,會發現我們得到的還是一個type的類型。

所以我們可以明白了,type是Python中用來創建所有類的元類,是所有模具的模具。在Python當中,我們把一個類的類叫做元類(metaclass)。所以type就是Python當中內置的元類,我們也可以自己創建我們需要的元類。通過元類,我們創建的對象也是一個類,而不是一個實例。

動態創建類

理解了type是一切類基礎之後,再來看動態類就簡單了。動態類是動態語言最大的特性之一,作為典型的動態語言,Python自然也是支持類型的動態創建的。

在Python當中,創建動態類型的一種方式就是通過type關鍵字。說起來有些意想不到,type函數不是用來查詢對象所屬的類型的嗎,怎麼還可以創建類呢?

這其實是type的另外一種用法,作為元類來創建一個類。在這種用法,type函數接收3個參數,分別是類型的名稱,父類的元組,以及一個字典。除了第一個參數之外,後面兩個參數都可以為空。比如我們來看一個例子:

注意,type返回的結果是一個類,而不是一個實例。所以我們還可以通過它創建實例:

hello = Hello()

這樣創建出來的是最簡單的空類,它什麼也沒有,和下面的代碼等價。

class Hello:
    pass

我們也可以在type的參數當中為這個類填充屬性和方法:

def hello_world(self):
    print('hello')
    
Hello = type('Hello', (), {'hello':hello_world, 'num': 3})

這樣我們就為Hello這個類創建了一個方法叫做hello,一個屬性num等於3。我們可以來調用一下試試:

也就是說我們可以使用type來根據我們的需要自行定義類,只不過type既可以獲取對象的類型又可以創建新的類,看起來可能覺得有些不太直觀,但是其實這也是說得通的。我們在Python當中通過調用str創建一個string對象,通過int來創建一個integer對象,那麼通過type則是創建一個類的對象。

實現繼承

我們之前說了,當我們使用type來創建類的時候,還可以傳入父類的元組從而實現類的繼承。

比如我們再創建一個叫做World的類繼承剛才通過type創建出來的Hello類,然後在為它加上額外的函數:

def say_world(self):
    print('World')
    
World = type('World', (Hello, ), {'world': say_world})

注意這裏傳入第二個參數是父類的元組,既然是元組,那麼當元素只有一個的時候,需要加上逗號,表示這是一個元組。這樣創建出來的類和我們通過class定義的靜態類效果是一樣的:

也就是說,我們可以先把函數實現,然後再根據任務的需要把這些函數組裝成新的類。顯然,這和傳統的C++以及Java這些靜態類型的語言相比,要靈活得多。

總結

我們固然可以通過type來創建動態創建類,但是從上面的使用過程也應該看得出來,這樣使用起來並不太方便,並且很多進階的功能很難實現。舉個簡單的例子,比如我們想要動態地為一個已有的類添加一些動態的方法,生成新的類。我們使用type就很難實現。type也的確不是Python元類的主要運用,metaclass才是王道,但由於篇幅限制,這部分將放在下一篇文章當中。

當然,元類是一個非常高級的用法,以至於Python的創始人說99%的Python程序員並不需要用到它。所以如果你覺得理解起來非常費勁的話也沒有關係,知道這麼個概念就可以了。

今天的內容就是這些,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

台中搬家公司費用怎麼算?

這有點猛!疑似 M1X 晶片的規格、效能跑分現身國外網站,12 核心 CPU + 16 核心 GPU

搭載 M1X 晶片 MacBook 可說是今年很多蘋果用戶最期待的產品之一,從 M1 來看,雖然已經知道這顆效能絕對不會差到哪去,但究竟有多強悍,相信不少人都想提前知道。而最近國外跑分網站就出現疑似 M1X 晶片的規格表,不僅非常猛,下方甚至還附上跑分比較表,如果是真的,那這顆實在有點誇張。

(圖片來源)

疑似 M1X 晶片的規格、效能跑分現身國外網站

近日國外 CPU Monkey 跑分網站上,出現一筆 Apple M1X 的跑分與規格資料,從下圖可以看到,這顆晶片採 5nm 製程技術,時脈雖然維持在 3.20GHz,但核心數提升到 12 顆,8 顆效能核心 + 4 顆節能核心。GPU 更誇張,核心數直接多一倍,變成 16 核心(M1 為 8 核心)。也有註明推出時間,預計在 2021 年的 Q2:

核心數跟去年底 LeasApplePro 爆料的 12 顆一樣,也增添這表格的可信度:

Next Mac March 12 cores

— LeaksApplePro (@LeaksApplePro) December 31, 2020

下方還有跑分數據圖,多核心相當猛,不過真實性還不知道,所以大家就參考即可,不用太認真看待。

首先是 Cinebench R23 單核心,時脈沒變,也因此分數當然跟 M1 差不多,獲得 1514 的同分表現:

Cinebench R23 多核心就超級猛,比 Ryzen 5700G 和 i9-10900X 還要高,獲得 14450 的分數:

Geekbench 5 64 位元單核心測試,也跟 M1 一樣,獲得 1744 的分數:

iGPU F32 效能測試,跟 M1 相比幾乎快提升一倍,拿下 5200 的超高分數:

如果到時 Apple 端出的 M1X 晶片真是這樣,那今年的新 Mac 看來也必入手不可阿,實在是讓人非常期待。

稍早也有消息指出,3/16 蘋果有可能舉辦春季新品發表會,不過預測新品表似乎沒有 Mac。

資料來源:CPU Monkey

針對 Apple M1 惡意軟體出現,安全自保守好三不

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!