最近挺焦慮的,不知道將來該作什麼,方向又是什麼。只能用別慌,月亮也正在大海的某處迷茫。
來安慰下本身。不過學習的初心我們仍是不要忘記。今天咱們學習的是enum分片算法。node
1.hash分區算法
2.stringhash分區算法
3.enum分區算法
4.numberrange分區算法
5.patternrange分區算法
6.date分區算法
7.jumpstringhash算法mysql
<tableRule name="rule_enum"> <rule> <columns>code</columns> <algorithm>func_enum</algorithm> </rule> </tableRule> <function name="enum" class="enum"> <property name="mapFile">partition.txt</property> <property name="defaultNode">0</property> <property name="type">0</property> </function>
enum和以前的hash算法同樣。須要在rule.xml中配置tableRule和function。算法
mapfile文件格式配置以下:
a.type=0,
int1=node0
int2=node1sql
a.type=其餘
string1=node0
string2=node1函數
當啓動的時候,會先根據type的值判斷是字符串仍是數字。而後把mapfile中配置的值加載到內存中,造成一個映射表。
例如上面的配置中type=0,就能夠判斷是數字,而後查看mapFile對應的文件partition.txt,能夠查到:
10000=0
10010=1
也就是枚舉值10000,就存放在分片1上,而枚舉值10010,就存放在分片2上。學習
當在運行的過程當中,若是有用戶經過查詢code=10000或者是code=10001的時候,就會訪問這個枚舉算法。根據上面的映射表直接查詢獲得分片的編號。測試
經過建立test_enum表,咱們插入三條數據,分別是code=10000,10010,10020,能夠看到10000被存放在分片1上,10010被存放在分片2上。這個和咱們在partition.txt中配置的文件同樣。當咱們插入10020的時候,由於枚舉值不存在,它會選擇默認的分片節點dn1。這裏不會由於錯誤而報錯。
枚舉在使用的時候,須要把已知的所有羅列出來。可是也有劣勢,就是可能羅列不全,在這個時候把不在枚舉定義範圍的數字存放到默認節點是一個沒有辦法的辦法,若是忽然由於某個新版本上線,出現一些新的枚舉類型而沒有及時更新,會致使默認節點數據快速膨脹。此時就須要進行擴容,而後實現局部數據遷移。code
今天介紹的枚舉算法較爲簡單。後續將繼續帶來剩下幾種算法,謝謝支持!xml