- 相關(guān)推薦
一致性hash算法在內(nèi)存數(shù)據(jù)庫中的應(yīng)用
業(yè)精于勤,荒于嬉;行成于思,毀于隨。學(xué)習(xí)編程的時候不僅要專心,更有用心。下面是小編整理的一致性hash算法在內(nèi)存數(shù)據(jù)庫中的應(yīng)用,希望對大家有用,更多消息請關(guān)注應(yīng)屆畢業(yè)生網(wǎng)。
由于redis是單點,但是項目中不可避免的會使用多臺Redis緩存服務(wù)器,那么怎么把緩存的Key均勻的映射到多臺Redis服務(wù)器上,且隨著緩存服務(wù)器的增加或減少時做到最小化的減少緩存Key的命中率呢?這樣就需要我們自己實現(xiàn)分布式。
Memcached對大家應(yīng)該不陌生,通過把Key映射到Memcached Server上,實現(xiàn)快速讀取。我們可以動態(tài)對其節(jié)點增加,并未影響之前已經(jīng)映射到內(nèi)存的Key與memcached Server之間的關(guān)系,這就是因為使用了一致性哈希。因為Memcached的哈希策略是在其客戶端實現(xiàn)的,因此不同的客戶端實現(xiàn)也有區(qū)別,以Spymemcache、Xmemcache為例,都是使用了KETAMA作為其實現(xiàn)。
一致性hash算法:
由于hash算法結(jié)果一般為unsigned int型,因此對于hash函數(shù)的結(jié)果應(yīng)該均勻分布在[0,2^32-1]區(qū)間,如果我們把一個圓環(huán)用2^32 個點來進行均勻切割,首先按照hash(key)函數(shù)算出服務(wù)器(節(jié)點)的哈希值, 并將其分布到0~2^32的圓環(huán)上。
用同樣的hash(key)函數(shù)求出需要存儲數(shù)據(jù)的鍵的哈希值,并映射到圓環(huán)上。然后從數(shù)據(jù)映射到的位置開始順時針查找,將數(shù)據(jù)保存到找到的第一個服務(wù)器(節(jié)點)上。key1、key2、key3和server1、server2通過hash都能在這個圓環(huán)上找到自己的位置,并且通過順時針的方式來將key定位到server。按上圖來說,key1和key2存儲到server1,而key3存儲到server2。如果新增一臺server,hash后在key1和key2之間,則只會影響key1(key1將會存儲在新增的server上),其它不變。
【拓展閱讀】
PHP語言最令人“抓狂”的特性
糟糕的type安全
這個問題簡直可怕,首先舉個PHP程序員們喜聞樂見的例子:
(string)"false"
(int)0
請注意,這并不屬于那種某些PHP支持者所爭論的“函數(shù)副作用”的典型情況。畢竟t當(dāng)中也包含著大量由于type轉(zhuǎn)換所引發(fā)的同類情況。事實上,這一行 想表達的是:左側(cè)為字符串,右側(cè)為一個整數(shù)。只不過左側(cè)與右側(cè)內(nèi)容完全相等。照這樣說來,如果讓PHP的設(shè)計者負責(zé)管理、世界上的每個人都能彼此和睦相處。
選擇太多,冗余太多
PHP語言的一大特色就是可做的事太多,做事的途徑同樣太多。每一行命令的結(jié)尾都可以通過數(shù)字符號或者雙斜線來進行注釋。無論是浮點數(shù)字還是雙精度數(shù)字都代表著同樣的含義。簡單的設(shè)計往往會被人們所忽略,因為大家在代碼貢獻過程中喜歡添加自己的小特性。這有點像依靠委員會體系進行設(shè)計,只不過該委員會從來沒考慮到過把其中的差異性剔除掉。
詭異的變量命名規(guī)則
把美元符號作為前綴實在不是個好主意。也許強制性地在所有變量前添加這個符號是為了更輕松地將其插入到模板當(dāng)中,但這樣說來常數(shù)內(nèi)容也同樣需要這么個符號啊—為什么實際上卻用不著呢?
CPU資源爭奪戰(zhàn)
對于32位計算設(shè)備來說,整數(shù)數(shù)值過大始終是個無法回避的難題。不過在另一方面,64位設(shè)備卻不會受此影響,也就是說代碼在不同設(shè)備上的運行狀態(tài)是不同的。大家可以在自己的筆記本上測試一下,我可以保證事實絕對是如此。但一旦把運行平臺轉(zhuǎn)換成服務(wù)器,情況則會再度變化。這時如果大家希望重現(xiàn)自己臺式機上的錯誤,結(jié)果恐怕要令各位失望。惟一的好消息是,32位設(shè)備將很可能最終消失。
SQL注入
將SQL注入這一安全漏洞的主要形式之一歸咎于PHP確實有失公允。人們在其它語言當(dāng)中同樣會不慎輸入奇怪的SQL字符串。之所以將其納入文章,主要是考慮到PHP語言更容易讓該漏洞攫取數(shù)據(jù)并發(fā)送至MySQL—簡單是輕而易舉。雖然新手在使用任何一種語言時都可能犯下同樣的錯誤,但這類情況在PHP中出現(xiàn)的機率明顯要高得多得多。
不兼容式的變更太多太多
不同版本之間存在巨大差異,兼容性問題也絕不是小事。以Java或者t為代表的編程語言在快速發(fā)展的同時也犧牲了向下兼容的特性。事實上,老代碼在新設(shè)備上無法運行的問題并不少見。但這一切與PHP的情況其實不盡相同。在PHP方面,不同版本之間往往差別巨大,因此大家只能祈禱自己的服務(wù)器已經(jīng)安裝了正確的版本,否則只有在出現(xiàn)嚴重問題時才能意識到大事不妙?偠灾,在查看服務(wù)器上是否有項目需要升級時,請優(yōu)先把目光對準(zhǔn)PHP。
更多PHP相關(guān)文章推薦:
7.phpmyadmin導(dǎo)入導(dǎo)出數(shù)據(jù)庫文件最大限制的解決方法
【一致性hash算法在內(nèi)存數(shù)據(jù)庫中的應(yīng)用】相關(guān)文章:
Linux系統(tǒng)中JVM內(nèi)存2GB上限的詳解09-03
java中全排列是如何生成算法09-05
Java內(nèi)存回收07-17
Windows內(nèi)存診斷07-07
Java的內(nèi)存模型09-22
如何擴大電腦內(nèi)存08-09