91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript如何讓雪花算法成為空氣

發布時間:2021-09-30 11:48:34 來源:億速云 閱讀:122 作者:柒染 欄目:web開發

這篇文章給大家介紹JavaScript如何讓雪花算法成為空氣,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

我也只能在這里,發表這樣無恥的言論。因為xjjdog的修為主要體現在后端上,所以愛屋及烏。這體現了斗爭是人類的基本屬性:程序員除了要干產品經理、項目經理,內部也并不是鐵板一塊。

1. 事出有因

就如標題所說,這個會和雪花算法有關。

我們有個系統,使用的是MySQL數據庫,所以在數據庫的主鍵選擇上,使用的是自增ID。

ID INT  PRIMARY KEY AUTO_INCREMENT

這樣的ID簡單流暢,但有一系列的弊端,不過用在一般的系統上,夠用了。

在臨上線之前,項目組邀請公司里最牛x的架構師,對項目進行了一次集中體檢。其中的一項重要舉措,就是針對于ID生成器的。

“不知道現在的開發系統,都至少要使用Snowflake作為ID生成器么?” 架構師對自增ID的方案非常的不滿意。

它指出,哪怕你使用UUID,在遇到系統擴容、分庫分表、數據遷移等場景的時候,也比自增ID強。

大家伙一討論,覺得非常合理。UUID太無序,美團Leaf這種又太復雜,還不如直接使用老掉牙的Snowflake,直接生成最簡單的ID即可。

類似于這種。

527574217068392807 527574217068392808

為了讓你有個直觀的認識,我們看一下Java中Long的最大值。

9223372036854775807

再看一下Int的最大值。

2147483647

可以看到生成的Snowflake ID,是比Int大,比Long小的數值(和最大的比較),所以在數據庫中使用bigint存儲,再好不過了。

說干就干,批量腳本一改,主鍵就變大變長了~~~

2. 問題發生

別說,這樣子的ID,看起來還比較順眼。ID在URL里傳遞,在formdata里傳遞,一看就比較的專業!

/edit.do?id=527574217068392810

系統按照建議改完之后,單元測試很流暢。黑盒測試草草的點了一下,就算通過了。

靈異事件是被客戶發現的。

客戶說,很多記錄,無法編輯、無法刪除。提示找不到記錄。

很多公司的尿性你也是知道的,和客戶交流的,通常不太懂技術。對著客戶的屏幕用牛x的手機拍照,原圖發過來就有十幾MB。但靈異的是圖片大,內容卻模模糊糊。

后端程序員,瞇著眼睛打開圖片,把里面顯示的ID給摳出來,放在系統里一查。

沒有此記錄。

肯定是瞇眼的姿勢有問題。后端程序員不得不再錄一遍。可惜的是,依然沒有這條記錄。

沒辦法,只好把客戶的數據庫拷貝一份過來。頁面上一點擊,果然有問題!

瀏覽器response里返回的數據竟然和preview里的不一樣

3. 問題驗證

也就是說,一個好好的數字:527183991665594368,經過瀏覽器一翻譯,變成了527183991665594400。

我們在瀏覽器的devtools里面調試一下。

JavaScript如何讓雪花算法成為空氣

為了進一步驗證,我們從typescript到js,都試驗一下。

 # cat test.ts let a = 527183991665594368; console.log(a);  # tsc test.ts  # cat test.js var a = 527183991665594368; console.log(a);  # node test.js 527183991665594400

可以看到,在整個js的生態里,都存在這個問題,真是坑壞了后端。

4. Why?

這是因為。在JavaScript中,存在兩種數字。Number和BigInt。最常用的,就是number。

最大的Number,叫做Number.MAX_SAFE_INTEGER,它的值為:

2^53-1 或者

+/- 9,007,199,254,740,991

眾所周知,Java中的Long,是64位的。Js中的這個安全Integer,完全達不到Java中定義的長度。

這就是萬惡的IEEE_754規范,它在Long長度大于17位時會出現精度丟失的問題。

在最新的TypeScript3.2中,可是直接使用BigInt這個類型進行編碼,或者使用long.js這種封裝后的苦,但還是太麻煩了,需要編碼太多,而且還可能漏掉。

使用數字類型,傳輸數據,實在是不太靠譜,轉來轉去,就物是人非了。

最好的方式,就是使用string進行傳遞。哪怕以后后臺ID的長度變成了128位的,也不懼怕這種轉換。

在Java中,如果你用的是jackson,直接通過注解,就可以完成字符串更改,不需要再改動數據庫。

@JsonSerialize(using=ToStringSerializer.class) private Long id;

這問題,明顯不是后端的鍋。后端傳遞了正確的數據到前端,能不能處理、處理的正確不正確,根本和后端一點關系都沒有。JS的這種按照規范的不規范處理,已經讓很多人踩坑。不管是萌新,還是老鳥,依然前赴后繼的掉到坑里,不得不說這個特性是非常反人類的。

關于JavaScript如何讓雪花算法成為空氣就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

谷城县| 萝北县| 大厂| 镇安县| 锡林郭勒盟| 祁门县| 长葛市| 洪江市| 大方县| 安乡县| 安溪县| 海晏县| 晋宁县| 睢宁县| 普格县| 洪洞县| 揭东县| 崇明县| 特克斯县| 阳新县| 土默特左旗| 高雄市| 清水河县| 万宁市| 香格里拉县| 霍山县| 尉氏县| 思茅市| 黔西县| 东方市| 彭山县| 海南省| 新乡县| 巢湖市| 车险| 玉溪市| 浏阳市| 钟祥市| 大丰市| 深州市| 安康市|