场景:
数据存储中,相互关系的表,尽量分库时落到同一个库中,避免遍历多个库查询,而且还能避免分布式事务。
一般分库或者分表我们采用取余操作,余数相同的id落到相同的库中,或分表规则一致。
解决理论:
参考:https://stackoverflow.com/questions/6670715/mod-of-power-2-on-bitwise-operators
根据理论:
He meant that taking number mod 2^n is equivalent to stripping off all but the n lowest-order (right-most) bits of number.
一个数取余2的n次方,那么余数就是这个数的二进制的最后n位数。所有我们可以位操作符把高位清零就可以得到余数。
int mod = number & ~(-1 << n)
所以,n的取舍关系到分库的数量或者分表的数量,即2^n 个库或表。故我们把二进制的最后n位数,即上述代码中的mod称为分库分表因子。
所以,需要生成的新id只要最后末尾放入分库或分表因子就达到了我们的目的。
参考:
https://github.com/baidu/uid-generato
https://github.com/johnhuang-cn/snowflake-uid
https://gitee.com/yu120/sequence
https://mp.weixin.qq.com/s/ad4tpM6cdi9r6vgfbaTzxg
https://github.com/sumory/uc/blob/master/src/com/sumory/uc/id/IdWorker.java
https://mp.weixin.qq.com/s/AHRCYOjnXAgcy2j6vziukQ
http://mziccard.me/2015/05/08/modulo-and-division-vs-bitwise-operations/
https://stackoverflow.com/questions/3072665/bitwise-and-in-place-of-modulus-operato
https://stackoverflow.com/questions/6670715/mod-of-power-2-on-bitwise-operators
https://stackoverflow.com/questions/3072665/bitwise-and-in-place-of-modulus-operato
https://github.com/Predictor/javasnowflake/blob/master/IdGenerator/src/org/predictor/idgenerator/BasicEntityIdGenerator.java
https://gitee.com/simpleweb/id-generato
————————————————
版权声明:本文为CSDN博主「A_Beaver」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/doctor_who2004/article/details/104025329
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。