成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如果有人問你ZooKeeper是什么,就把這篇文章發(fā)給他。

suosuopuo / 3458人閱讀

摘要:所以,雅虎的開發(fā)人員就試圖開發(fā)一個通用的無單點(diǎn)問題的分布式協(xié)調(diào)框架,以便讓開發(fā)人員將精力集中在處理業(yè)務(wù)邏輯上。在立項(xiàng)初期,考慮到之前內(nèi)部很多項(xiàng)目都是使用動物的名字來命名的例如著名的項(xiàng)目雅虎的工程師希望給這個項(xiàng)目也取一個動物的名字。

前言

提到ZooKeeper,相信大家都不會陌生。Dubbo,Kafka,Hadoop等等項(xiàng)目里都能看到它的影子。但是你真的了解 ZooKeeper 嗎?如果面試官讓你給他講講 ZooKeeper 是個什么東西,你能回答到什么地步呢?

我會用兩個篇幅介紹ZooKeeper ,第一篇是概念性的認(rèn)識,這篇你會得到 ZooKeeper 是什么,ZooKeeper 設(shè)計(jì)的目標(biāo),ZooKeeper 能做什么和ZooKeeper 基本的概念。第二篇我會從實(shí)戰(zhàn)出發(fā),安裝ZooKeeper,寫一些ZooKeeper 具體應(yīng)用場景的代碼實(shí)現(xiàn)。

一、ZooKeeper是什么

ZooKeeper 是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。

官網(wǎng):http://zookeeper.apache.org/

源碼:https://github.com/apache/zoo...

二、ZooKeeper 的由來

下面這段內(nèi)容摘自《從Paxos到Zookeeper 》 ,本文中很多的名詞介紹也來自本書。

Zookeeper 最早起源于雅虎研究院的一個研究小組。在當(dāng)時,研究人員發(fā)現(xiàn),在雅虎內(nèi)部很多大型系統(tǒng)基本都需要依賴一個類似的系統(tǒng)來進(jìn)行分布式協(xié)調(diào),但是這些系統(tǒng)往往都存在分布式單點(diǎn)問題。所以,雅虎的開發(fā)人員就試圖開發(fā)一個通用的無單點(diǎn)問題的分布式協(xié)調(diào)框架,以便讓開發(fā)人員將精力集中在處理業(yè)務(wù)邏輯上。
關(guān)于“ZooKeeper”這個項(xiàng)目的名字,其實(shí)也有一段趣聞。在立項(xiàng)初期,考慮到之前內(nèi)部很多項(xiàng)目都是使用動物的名字來命名的(例如著名的Pig項(xiàng)目),雅虎的工程師希望給這個項(xiàng)目也取一個動物的名字。時任研究院的首席科學(xué)家 RaghuRamakrishnan 開玩笑地說:“在這樣下去,我們這兒就變成動物園了!”此話一出,大家紛紛表示就叫動物園管理員吧一一一因?yàn)楦鱾€以動物命名的分布式組件放在一起,雅虎的整個分布式系統(tǒng)看上去就像一個大型的動物園了,而 Zookeeper 正好要用來進(jìn)行分布式環(huán)境的協(xié)調(diào)一一于是,Zookeeper 的名字也就由此誕生了。
三、ZooKeeper的特性

順序一致性,從同一個客戶端發(fā)起的事務(wù)請求,最終將會嚴(yán)格地按照其發(fā)起順序被應(yīng)用到Zookeeper中去。

原子性,所有事務(wù)請求的處理結(jié)果在整個集群中所有機(jī)器上的應(yīng)用情況是一致的,即整個集群要么都成功應(yīng)用了某個事務(wù),要么都沒有應(yīng)用。

單一視圖,無論客戶端連接的是哪個 Zookeeper 服務(wù)器,其看到的服務(wù)端數(shù)據(jù)模型都是一致的。

可靠性,一旦服務(wù)端成功地應(yīng)用了一個事務(wù),并完成對客戶端的響應(yīng),那么該事務(wù)所引起的服務(wù)端狀態(tài)變更將會一直被保留,除非有另一個事務(wù)對其進(jìn)行了變更。

實(shí)時性,Zookeeper 保證在一定的時間段內(nèi),客戶端最終一定能夠從服務(wù)端上讀取到最新的數(shù)據(jù)狀態(tài)。

四、ZooKeeper的設(shè)計(jì)目標(biāo)

簡單的數(shù)據(jù)結(jié)構(gòu)
Zookeeper 使得分布式程序能夠通過一個共享的樹形結(jié)構(gòu)的名字空間來進(jìn)行相互協(xié)調(diào),即Zookeeper 服務(wù)器內(nèi)存中的數(shù)據(jù)模型由一系列被稱為ZNode的數(shù)據(jù)節(jié)點(diǎn)組成,Zookeeper 將全量的數(shù)據(jù)存儲在內(nèi)存中,以此來提高服務(wù)器吞吐、減少延遲的目的。

可以構(gòu)建集群
Zookeeper 集群通常由一組機(jī)器構(gòu)成,組成 Zookeeper 集群的而每臺機(jī)器都會在內(nèi)存中維護(hù)當(dāng)前服務(wù)器狀態(tài),并且每臺機(jī)器之間都相互通信。

順序訪問

對于來自客戶端的每個更新請求,Zookeeper 都會分配一個全局唯一的遞增編號,這個編號反映了所有事務(wù)操作的先后順序。

高性能

Zookeeper 和Redis一樣全量數(shù)據(jù)存儲在內(nèi)存中,100%讀請求壓測QPS 12-13W。

五、關(guān)于 ZooKeeper 的一些重要概念 5.1 Zookeeper 集群:

Zookeeper 是一個由多個 server 組成的集群,一個 leader,多個 follower。(這個不同于我們常見的Master/Slave模式)leader 為客戶端服務(wù)器提供讀寫服務(wù),除了leader外其他的機(jī)器只能提供讀服務(wù)。
每個 server 保存一份數(shù)據(jù)副本全數(shù)據(jù)一致,分布式讀 follower,寫由 leader 實(shí)施更新請求轉(zhuǎn)發(fā),由 leader 實(shí)施更新請求順序進(jìn)行,來自同一個 client 的更新請求按其發(fā)送順序依次執(zhí)行數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗。全局唯一數(shù)據(jù)視圖,client 無論連接到哪個 server,數(shù)據(jù)視圖都是一致的實(shí)時性,在一定事件范圍內(nèi),client 能讀到最新數(shù)據(jù)。

5.2 集群角色

Leader:是整個 Zookeeper 集群工作機(jī)制中的核心 。Leader 作為整個 ZooKeeper 集群的主節(jié)點(diǎn),負(fù)責(zé)響應(yīng)所有對 ZooKeeper 狀態(tài)變更的請求。
主要工作:

事務(wù)請求的唯一調(diào)度和處理,保障集群處理事務(wù)的順序性。

集群內(nèi)各服務(wù)器的調(diào)度者。

Leader 選舉是 Zookeeper 最重要的技術(shù)之一,也是保障分布式數(shù)據(jù)一致性的關(guān)鍵所在。我們以三臺機(jī)器為例,在服務(wù)器集群初始化階段,當(dāng)有一臺服務(wù)器Server1啟動時候是無法完成選舉的,當(dāng)?shù)诙_機(jī)器 Server2 啟動后兩臺機(jī)器能互相通信,每臺機(jī)器都試圖找到一個leader,于是便進(jìn)入了 leader 選舉流程.

每個 server 發(fā)出一個投票

投票的最基本元素是(SID-服務(wù)器id,ZXID-事物id)

接受來自各個服務(wù)器的投票

處理投票
優(yōu)先檢查 ZXID(數(shù)據(jù)越新ZXID越大),ZXID比較大的作為leader,ZXID一樣的情況下比較SID

統(tǒng)計(jì)投票

  這里有個**過半**的概念,大于集群機(jī)器數(shù)量的一半,即大于或等于(n/2+1),我們這里的由三臺,大于等于2即為達(dá)到“過半”的要求。
  這里也有引申到為什么 Zookeeper 集群推薦是單數(shù)。

集群數(shù)量 至少正常運(yùn)行數(shù)量 允許掛掉的數(shù)量
2 2的半數(shù)為1,半數(shù)以上最少為2 0
3 3的半數(shù)為1.5,半數(shù)以上最少為2 1
4 4的半數(shù)為2,半數(shù)以上最少為3 1
5 5的半數(shù)為2.5,半數(shù)以上最少為3 2
6 6的半數(shù)為3,半數(shù)以上最少為4 2

通過以上可以發(fā)現(xiàn),3臺服務(wù)器和4臺服務(wù)器都最多允許1臺服務(wù)器掛掉,5臺服務(wù)器和6臺服務(wù)器都最多允許2臺服務(wù)器掛掉,明顯4臺服務(wù)器成本高于3臺服務(wù)器成本,6臺服務(wù)器成本高于5服務(wù)器成本。這是由于半數(shù)以上投票通過決定的。

改變服務(wù)器狀態(tài)

一旦確定了 leader,服務(wù)器就會更改自己的狀態(tài),且一半不會再發(fā)生變化,比如新機(jī)器加入集群、非 leader 掛掉一臺。

Follower :是 Zookeeper 集群狀態(tài)的跟隨者。他的邏輯就比較簡單。除了響應(yīng)本服務(wù)器上的讀請求外,follower 還要處理leader 的提議,并在 leader 提交該提議時在本地也進(jìn)行提交。另外需要注意的是,leader 和 follower 構(gòu)成ZooKeeper 集群的法定人數(shù),也就是說,只有他們才參與新 leader的選舉、響應(yīng) leader 的提議。

Observer :服務(wù)器充當(dāng)一個觀察者的角色。如果 ZooKeeper 集群的讀取負(fù)載很高,或者客戶端多到跨機(jī)房,可以設(shè)置一些 observer 服務(wù)器,以提高讀取的吞吐量。Observer 和 Follower 比較相似,只有一些小區(qū)別:首先 observer 不屬于法定人數(shù),即不參加選舉也不響應(yīng)提議,也不參與寫操作的“過半寫成功”策略;其次是 observer 不需要將事務(wù)持久化到磁盤,一旦 observer 被重啟,需要從 leader 重新同步整個名字空間。

5.3會話(Session)

Session 指的是 ZooKeeper 服務(wù)器與客戶端會話。在 ZooKeeper 中,一個客戶端連接是指客戶端和服務(wù)器之間的一個 TCP 長連接。客戶端啟動的時候,首先會與服務(wù)器建立一個 TCP 連接,從第一次連接建立開始,客戶端會話的生命周期也開始了。通過這個連接,客戶端能夠通過心跳檢測與服務(wù)器保持有效的會話,也能夠向Zookeeper 服務(wù)器發(fā)送請求并接受響應(yīng),同時還能夠通過該連接接收來自服務(wù)器的Watch事件通知。 Session 的 sessionTimeout 值用來設(shè)置一個客戶端會話的超時時間。當(dāng)由于服務(wù)器壓力太大、網(wǎng)絡(luò)故障或是客戶端主動斷開連接等各種原因?qū)е驴蛻舳诉B接斷開時,只要在sessionTimeout規(guī)定的時間內(nèi)能夠重新連接上集群中任意一臺服務(wù)器,那么之前創(chuàng)建的會話仍然有效。在為客戶端創(chuàng)建會話之前,服務(wù)端首先會為每個客戶端都分配一個sessionID。由于 sessionID 是 Zookeeper 會話的一個重要標(biāo)識,許多與會話相關(guān)的運(yùn)行機(jī)制都是基于這個 sessionID 的,因此,無論是哪臺服務(wù)器為客戶端分配的 sessionID,都務(wù)必保證全局唯一。

5.3.1 會話(Session)

在Zookeeper客戶端與服務(wù)端成功完成連接創(chuàng)建后,就創(chuàng)建了一個會話,Zookeeper會話在整個運(yùn)行期間的生命周期中,會在不同的會話狀態(tài)中之間進(jìn)行切換,這些狀態(tài)可以分為CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE等。

一旦客戶端開始創(chuàng)建Zookeeper對象,那么客戶端狀態(tài)就會變成CONNECTING狀態(tài),同時客戶端開始嘗試連接服務(wù)端,連接成功后,客戶端狀態(tài)變?yōu)镃ONNECTED,通常情況下,由于斷網(wǎng)或其他原因,客戶端與服務(wù)端之間會出現(xiàn)斷開情況,一旦碰到這種情況,Zookeeper客戶端會自動進(jìn)行重連服務(wù),同時客戶端狀態(tài)再次變成CONNCTING,直到重新連上服務(wù)端后,狀態(tài)又變?yōu)镃ONNECTED,在通常情況下,客戶端的狀態(tài)總是介于CONNECTING 和CONNECTED 之間。但是,如果出現(xiàn)諸如會話超時、權(quán)限檢查或是客戶端主動退出程序等情況,客戶端的狀態(tài)就會直接變更為CLOSE狀態(tài)。

5.3.2 會話創(chuàng)建

Session是Zookeeper中的會話實(shí)體,代表了一個客戶端會話,其包含了如下四個屬性

sessionID。會話ID,唯一標(biāo)識一個會話,每次客戶端創(chuàng)建新的會話時,Zookeeper都會為其分配一個全局唯一的sessionID。

TimeOut。會話超時時間,客戶端在構(gòu)造Zookeeper實(shí)例時,會配置sessionTimeout參數(shù)用于指定會話的超時時間,Zookeeper客戶端向服務(wù)端發(fā)送這個超時時間后,服務(wù)端會根據(jù)自己的超時時間限制最終確定會話的超時時間。

TickTime。下次會話超時時間點(diǎn),為了便于Zookeeper對會話實(shí)行”分桶策略”管理,同時為了高效低耗地實(shí)現(xiàn)會話的超時檢查與清理,Zookeeper會為每個會話標(biāo)記一個下次會話超時時間點(diǎn),其值大致等于當(dāng)前時間加上TimeOut。

isClosing。標(biāo)記一個會話是否已經(jīng)被關(guān)閉,當(dāng)服務(wù)端檢測到會話已經(jīng)超時失效時,會將該會話的isClosing標(biāo)記為”已關(guān)閉”,這樣就能確保不再處理來自該會話的心情求了。

Zookeeper為了保證請求會話的全局唯一性,在SessionTracker初始化時,調(diào)用initializeNextSession方法生成一個sessionID,之后在Zookeeper運(yùn)行過程中,會在該sessionID的基礎(chǔ)上為每個會話進(jìn)行分配,初始化算法如下

    
```
    public static long initializeNextSession(long id) {
      long nextSid = 0;
      // 無符號右移8位使為了避免左移24后,再右移8位出現(xiàn)負(fù)數(shù)而無法通過高8位確定sid值
      nextSid = (System.currentTimeMillis() << 24) >>> 8;
      nextSid = nextSid | (id << 56);
      return nextSid;
    }

    ```
5.3.3 會話管理

Zookeeper的會話管理主要是通過SessionTracker來負(fù)責(zé),其采用了分桶策略(將類似的會話放在同一區(qū)塊中進(jìn)行管理)進(jìn)行管理,以便Zookeeper對會話進(jìn)行不同區(qū)塊的隔離處理以及同一區(qū)塊的統(tǒng)一處理。

![分捅策略](https://user-gold-cdn.xitu.io/2018/9/29/166257afb3cda676?w=539&h=226&f=jpeg&s=14185)
5.4 數(shù)據(jù)節(jié)點(diǎn) Znode

在Zookeeper中,“節(jié)點(diǎn)"分為兩類,第一類同樣是指構(gòu)成集群的機(jī)器,我們稱之為機(jī)器節(jié)點(diǎn);第二類則是指數(shù)據(jù)模型中的數(shù)據(jù)單元,我們稱之為數(shù)據(jù)節(jié)點(diǎn)一一ZNode。
Zookeeper將所有數(shù)據(jù)存儲在內(nèi)存中,數(shù)據(jù)模型是一棵樹(Znode Tree),由斜杠(/)的進(jìn)行分割的路徑,就是一個Znode,例如/foo/path1。每個上都會保存自己的數(shù)據(jù)內(nèi)容,同時還會保存一系列屬性信息。

![節(jié)點(diǎn)](https://user-gold-cdn.xitu.io/2018/9/29/166257af640f5e1f?w=442&h=253&f=jpeg&s=12655)
5.4.1 節(jié)點(diǎn)類型

在Zookeeper中,node可以分為持久節(jié)點(diǎn)和臨時節(jié)點(diǎn)和順序節(jié)點(diǎn)三大類。

   可以通過組合生成如下四種類型節(jié)點(diǎn)                           
1. PERSISTENT

持久節(jié)點(diǎn),節(jié)點(diǎn)創(chuàng)建后便一直存在于Zookeeper服務(wù)器上,直到有刪除操作來主動清楚該節(jié)點(diǎn)。

2. PERSISTENT_SEQUENTIAL

持久順序節(jié)點(diǎn),相比持久節(jié)點(diǎn),其新增了順序特性,每個父節(jié)點(diǎn)都會為它的第一級子節(jié)點(diǎn)維護(hù)一份順序,用于記錄每個子節(jié)點(diǎn)創(chuàng)建的先后順序。在創(chuàng)建節(jié)點(diǎn)時,會自動添加一個數(shù)字后綴,作為新的節(jié)點(diǎn)名,該數(shù)字后綴的上限是整形的最大值。

   3.EPEMERAL

臨時節(jié)點(diǎn),臨時節(jié)點(diǎn)的生命周期與客戶端會話綁定,客戶端失效,節(jié)點(diǎn)會被自動清理。同時,Zookeeper規(guī)定不能基于臨時節(jié)點(diǎn)來創(chuàng)建子節(jié)點(diǎn),即臨時節(jié)點(diǎn)只能作為葉子節(jié)點(diǎn)。

4.EPEMERAL_SEQUENTIAL

臨時順序節(jié)點(diǎn),在臨時節(jié)點(diǎn)的基礎(chǔ)添加了順序特性。

5.5 版本——保證分布式數(shù)據(jù)原子性操作

每個數(shù)據(jù)節(jié)點(diǎn)都具有三種類型的版本信息,對數(shù)據(jù)節(jié)點(diǎn)的任何更新操作都會引起版本號的變化。

version– 當(dāng)前數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)內(nèi)容的版本號
cversion– 當(dāng)前數(shù)據(jù)子節(jié)點(diǎn)的版本號
aversion– 當(dāng)前數(shù)據(jù)節(jié)點(diǎn)ACL變更版本號

  上述各版本號都是表示修改次數(shù),如version為1表示對數(shù)據(jù)節(jié)點(diǎn)的內(nèi)容變更了一次。即使前后兩次變更并沒有改變數(shù)據(jù)內(nèi)容,version的值仍然會改變。version可以用于寫入驗(yàn)證,類似于CAS。

5.6watcher事件監(jiān)聽器

ZooKeeper允許用戶在指定節(jié)點(diǎn)上注冊一些Watcher,當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生變化的時候,ZooKeeper服務(wù)器會把這個變化的通知發(fā)送給感興趣的客戶端

5.7 ACL 權(quán)限控制——保障數(shù)據(jù)的安全

ACL是Access Control Lists 的簡寫, ZooKeeper采用ACL策略來進(jìn)行權(quán)限控制,有以下權(quán)限:
CREATE:創(chuàng)建子節(jié)點(diǎn)的權(quán)限
READ:獲取節(jié)點(diǎn)數(shù)據(jù)和子節(jié)點(diǎn)列表的權(quán)限
WRITE:更新節(jié)點(diǎn)數(shù)據(jù)的權(quán)限
DELETE:刪除子節(jié)點(diǎn)的權(quán)限
ADMIN:設(shè)置節(jié)點(diǎn)ACL的權(quán)限

5.8 Paxos算法

Paxos算法是基于消息傳遞且具有高度容錯特性的一致性算法,是目前公認(rèn)的解決分布式一致性問題最有效的算法之一。(其他算法有二階段提交、三階段提交等)
篇幅較長 可以參考https://www.cnblogs.com/linbi...

六、ZooKeeper 可以做什么?

分布式服務(wù)注冊與訂閱

在分布式環(huán)境中,為了保證高可用性,通常同一個應(yīng)用或同一個服務(wù)的提供方都會部署多份,達(dá)到對等服務(wù)。而消費(fèi)者就須要在這些對等的服務(wù)器中選擇一個來執(zhí)行相關(guān)的業(yè)務(wù)邏輯,比較典型的服務(wù)注冊與訂閱,代表:dubbo。

分布式配置中心
發(fā)布與訂閱模型,即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZK節(jié)點(diǎn)上,供訂閱者獲取數(shù)據(jù),實(shí)現(xiàn)配置信息的集中式管理和動態(tài)更新。代表:百度的disconf。

github:https://github.com/knightliao...

命名服務(wù)

在分布式系統(tǒng)中,通過使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來獲取資源或服務(wù)的地址,提供者等信息。被命名的實(shí)體通??梢允羌褐械臋C(jī)器,提供的服務(wù)地址,進(jìn)程對象等等——這些我們都可以統(tǒng)稱他們?yōu)槊郑∟ame)。其中較為常見的就是一些分布式服務(wù)框架中的服務(wù)地址列表。通過調(diào)用ZK提供的創(chuàng)建節(jié)點(diǎn)的API,能夠很容易創(chuàng)建一個全局唯一的path,這個path就可以作為一個名稱。

分布式鎖

分布式鎖,這個主要得益于ZooKeeper為我們保證了數(shù)據(jù)的強(qiáng)一致性。鎖服務(wù)可以分為兩類,一個是保持獨(dú)占,另一個是控制時序。
所謂保持獨(dú)占,就是所有試圖來獲取這個鎖的客戶端,最終只有一個可以成功獲得這把鎖。通常的做法是把zk上的一個znode看作是一把鎖,通過create znode的方式來實(shí)現(xiàn)。所有客戶端都去創(chuàng)建 /distribute_lock 節(jié)點(diǎn),最終成功創(chuàng)建的那個客戶端也即擁有了這把鎖。
控制時序,就是所有視圖來獲取這個鎖的客戶端,最終都是會被安排執(zhí)行,只是有個全局時序了。做法和上面基本類似,只是這里 /distribute_lock 已絆預(yù)先存在,客戶端在它下面創(chuàng)建臨時有序節(jié)點(diǎn)(這個可以通過節(jié)點(diǎn)的屬性控制:CreateMode.EPHEMERAL_SEQUENTIAL來指定)。Zk的父節(jié)點(diǎn)(/distribute_lock)維持一份sequence,保證子節(jié)點(diǎn)創(chuàng)建的時序性,從而也形成了每個客戶端的全局時序

Master選舉

負(fù)載均衡

參考

《從Paxos到Zookeeper 》

《ZooKeeper深入淺出 》

推薦閱讀

互聯(lián)網(wǎng)公司面試必問的Redis題目

互聯(lián)網(wǎng)公司面試必問的mysql題目(下)

最近,我組建了個群聊。學(xué)習(xí)Java進(jìn)階技術(shù)干貨、實(shí)踐分享,職位內(nèi)推,一起聊聊理想。志同道合的朋友,歡迎你的加入。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72049.html

相關(guān)文章

  • 以后有面試官問你跳躍表,你把這文章扔給

    摘要:跳躍表的空間復(fù)雜度為。不過,二叉查找樹是有可能出現(xiàn)一種極端的情況的,就是如果插入的數(shù)據(jù)剛好一直有序,那么所有節(jié)點(diǎn)會偏向某一邊。例如這種接結(jié)構(gòu)會導(dǎo)致二叉查找樹的查找效率變?yōu)檫@會使二叉查找樹大打折扣。假如我們要用某種數(shù)據(jù)結(jié)構(gòu)來維護(hù)一組有序的int型數(shù)據(jù)的集合,并且希望這個數(shù)據(jù)結(jié)構(gòu)在插入、刪除、查找等操作上能夠盡可能著快速,那么,你會用什么樣的數(shù)據(jù)結(jié)構(gòu)呢? 數(shù)組 一種很簡單的方法應(yīng)該就是采用數(shù)組了...

    nidaye 評論0 收藏0
  • 以后再有人問你selenium什么,你把這文章

    摘要:不同目標(biāo)的自動化測試有不同的測試工具,但是任何工具都無不例外的需要編程的過程,實(shí)現(xiàn)源代碼,也可以稱之為測試腳本。 寫在最前面:目前自動化測試并不屬于新鮮的事物,或者說自動化測試的各種方法論已經(jīng)層出不窮,但是,能夠在項(xiàng)目中持之以恒的實(shí)踐自動化測試的團(tuán)隊(duì),卻依舊不是非常多。有的團(tuán)隊(duì)知道怎么做,做的還不夠好;有的團(tuán)隊(duì)還正在探索和摸索怎么做,甚至還有一些多方面的技術(shù)上和非技術(shù)上的舊系統(tǒng)需要重構(gòu)……...

    Keven 評論0 收藏0
  • zookeeper小入門(二)

    摘要:就是上面提到的變化后執(zhí)行的程序。這段代碼是的構(gòu)造函數(shù),除了里面的一些賦值函數(shù),重點(diǎn)說下這個函數(shù)它有個參數(shù),第一個參數(shù)是你要的名字,類似這樣的。 昨晚微信開放了JS接口。忙活了一晚上。 然后周六就沒啥斗志了,突然想起第二篇說好要介紹demo的沒介紹,就趕緊來寫了。 先來個 傳送門 這里簡單介紹了下官方demo。用來演示Zookeeper官方推薦的程序框架(Executor、DataM...

    CoffeX 評論0 收藏0
  • 如果有人問你爬蟲抓取技術(shù)的門道,請叫來看這文章

    摘要:未授權(quán)的爬蟲抓取程序是危害原創(chuàng)內(nèi)容生態(tài)的一大元兇,因此要保護(hù)網(wǎng)站的內(nèi)容,首先就要考慮如何反爬蟲。反爬蟲的銀彈目前的反抓取機(jī)器人檢查手段,最可靠的還是驗(yàn)證碼技術(shù)。機(jī)器人協(xié)議除此之外,在爬蟲抓取技術(shù)領(lǐng)域還有一個白道的手段,叫做協(xié)議。 本文首發(fā)于我的個人博客,同步發(fā)布于SegmentFault專欄,非商業(yè)轉(zhuǎn)載請注明出處,商業(yè)轉(zhuǎn)載請閱讀原文鏈接里的法律聲明。 web是一個開放的平臺,這也奠定了...

    raoyi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<