一致性hash算法在內存數據庫中的應用技巧
【提要】本篇《一致性hash算法在內存數據庫中的應用》特別為需要編程學習的朋友收集整理的,僅供參考。內容如下:
業精於勤,荒於嬉;行成於思,毀於隨。學習編程的時候不僅要專心,更有用心。下面是小編整理的一致性hash算法在內存數據庫中的應用,希望對大家有用,更多消息請關注。
由於redis是單點,但是項目中不可避免的會使用多台Redis緩存服務器,那麼怎麼把緩存的Key均勻的映射到多台Redis服務器上,且隨着緩存服務器的增加或減少時做到最小化的減少緩存Key的命中率呢?這樣就需要我們自己實現分佈式。
Memcached對大家應該不陌生,通過把Key映射到Memcached Server上,實現快速讀取。我們可以動態對其節點增加,並未影響之前已經映射到內存的Key與memcached Server之間的關係,這就是因為使用了一致性哈希。因為Memcached的哈希策略是在其客户端實現的,因此不同的客户端實現也有區別,以Spymemcache、Xmemcache為例,都是使用了KETAMA作為其實現。
一致性hash算法:
由於hash算法結果一般為unsigned int型,因此對於hash函數的結果應該均勻分佈在[0,2^32-1]區間,如果我們把一個圓環用2^32 個點來進行均勻切割,首先按照hash(key)函數算出服務器(節點)的哈希值, 並將其分佈到0~2^32的圓環上。
用同樣的hash(key)函數求出需要存儲數據的鍵的`哈希值,並映射到圓環上。然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器(節點)上。key1、key2、key3和server1、server2通過hash都能在這個圓環上找到自己的位置,並且通過順時針的方式來將key定位到server。按上圖來説,key1和key2存儲到server1,而key3存儲到server2。如果新增一台server,hash後在key1和key2之間,則只會影響key1(key1將會存儲在新增的server上),其它不變。
【拓展閲讀】
PHP語言最令人“抓狂”的特性
糟糕的type安全
這個問題簡直可怕,首先舉個PHP程序員們喜聞樂見的例子:
(string)"false"
(int)0
請注意,這並不屬於那種某些PHP支持者所爭論的“函數副作用”的典型情況。畢竟t當中也包含着大量由於type轉換所引發的同類情況。事實上,這一行 想表達的是:左側為字符串,右側為一個整數。只不過左側與右側內容完全相等。照這樣説來,如果讓PHP的設計者負責管理、世界上的每個人都能彼此和睦相處。
選擇太多,宂餘太多
PHP語言的一大特色就是可做的事太多,做事的途徑同樣太多。每一行命令的結尾都可以通過數字符號或者雙斜線來進行註釋。無論是浮點數字還是雙精度數字都代表着同樣的含義。簡單的設計往往會被人們所忽略,因為大家在代碼貢獻過程中喜歡添加自己的小特性。這有點像依靠委員會體系進行設計,只不過該委員會從來沒考慮到過把其中的差異性剔除掉。
詭異的變量命名規則
把美元符號作為前綴實在不是個好主意。也許強制性地在所有變量前添加這個符號是為了更輕鬆地將其插入到模板當中,但這樣説來常數內容也同樣需要這麼個符號啊—為什麼實際上卻用不着呢?
CPU資源爭奪戰
對於32位計算設備來説,整數數值過大始終是個無法迴避的難題。不過在另一方面,64位設備卻不會受此影響,也就是説代碼在不同設備上的運行狀態是不同的。大家可以在自己的筆記本上測試一下,我可以保證事實絕對是如此。但一旦把運行平台轉換成服務器,情況則會再度變化。這時如果大家希望重現自己台式機上的錯誤,結果恐怕要令各位失望。惟一的好消息是,32位設備將很可能最終消失。
SQL注入
將SQL注入這一安全漏洞的主要形式之一歸咎於PHP確實有失公允。人們在其它語言當中同樣會不慎輸入奇怪的SQL字符串。之所以將其納入文章,主要是考慮到PHP語言更容易讓該漏洞攫取數據併發送至MySQL—簡單是輕而易舉。雖然新手在使用任何一種語言時都可能犯下同樣的錯誤,但這類情況在PHP中出現的機率明顯要高得多得多。
不兼容式的變更太多太多
不同版本之間存在巨大差異,兼容性問題也絕不是小事。以Java或者t為代表的編程語言在快速發展的同時也犧牲了向下兼容的特性。事實上,老代碼在新設備上無法運行的問題並不少見。但這一切與PHP的情況其實不盡相同。在PHP方面,不同版本之間往往差別巨大,因此大家只能祈禱自己的服務器已經安裝了正確的版本,否則只有在出現嚴重問題時才能意識到大事不妙。總而言之,在查看服務器上是否有項目需要升級時,請優先把目光對準PHP。更多PHP相關文章推薦:
語言基礎知識
torm 2016特色
3.最實用的PHP實例代碼21個
 
;中防止SQL注入的方法
中的條件結構語句
的錯誤機制總結
yadmin導入導出數據庫文件最大限制的解決方法
安全:全面解析跨站腳本攻擊
學習:PHP拼音類
中實現頁面跳轉
-
收縮SQL數據庫的方法
一般情況下,SQL數據庫的收縮並不能很大程度上減小數據庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免數據庫日誌過大1、設置數據庫模式為簡單模式:打開SQL企業管理器,在控制枱根目錄中依次點開MicrosoftSQLServer-->SQLServer組-->雙擊打開你的服務器-->...
-
U盤重裝系統步驟圖解
現在,好多小夥伴都有一台心愛的筆記本電腦,但卻苦於當前的系統太卡,或者系統不能正常使用了。沒關係,下面小編教你U盤重裝系統win7步驟圖文教程!希望能夠對你有所幫助!一、製作U極速U盤啟動盤1.下載並安裝U盤啟動盤製作軟件,本教程以”U極速“為例。2.打開“U極速”U...
-
學生信息管理系統的論文
當代,論文常用來指進行各個學術領域的研究和描述學術研究成果的文章,簡稱之為論文。它既是探討問題進行學術研究的一種手段,又是描述學術研究成果進行學術交流的一種工具。以下是小編整理的學生信息管理系統的論文,歡迎閲讀!【摘要】本文針對目前學校學生信息管理效...
-
ecshop數據庫備份和數據庫恢復的方法
1、數據庫備份(1)備份類型:有四種備份類型:全部備份:就是備份ECShop所有的表。一般選擇這個方式,這個方式可以在災難恢復的時候快速恢復。標準備份:備份一些常用的表。最小備份:備份重要的一些數據表。自定義備份:可以指定備份那些表。這種方法比較靈活。(2)其他選項:使...