最近挺焦虑的,不知道将来该作什么,方向又是什么。只能用别慌,月亮也正在大海的某处迷茫。
来安慰下本身。不过学习的初心我们仍是不要忘记。今天咱们学习的是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