- 在自定义分库分表路由springboot-starter中,采用如下算法实现数据不倾斜,保证每个表的数据都比较均匀。
- 核心思想:斐波那契散列法
- 主要利用到的技术:mybatis插件拦截器,aop切面,自定义注解,starter开发,数据源自定义配置。
核心分库分表代码:
int size = dbRouterConfig.getDatabaseCount() * dbRouterConfig.getTableCount();
//扰动函数 idx = 1 2 3 4 5 6 7
int idx = (size - 1) & (dbKeyAttr.hashCode() ^ (dbKeyAttr.hashCode() >>> 16));
int dbIdx = idx / dbRouterConfig.getTableCount() + 1;
int tbIdx = idx - dbRouterConfig.getTableCount() * (dbIdx - 1);
database数量:2
table数量:4
测试结果:
dbIdx:::1||||tbIdx:::0
dbIdx:::1||||tbIdx:::1
dbIdx:::1||||tbIdx:::2
dbIdx:::1||||tbIdx:::3
dbIdx:::2||||tbIdx:::0
dbIdx:::2||||tbIdx:::1
dbIdx:::2||||tbIdx:::2
dbIdx:::2||||tbIdx:::3