用户user_id=666 (666的二进制表示为:0000 0010 1001 1010)的用户生成一个订单步骤:
使用user_id%16(假设16个库)分库,决定这行数据要插入到哪个库中
分库基因是user_id的最后4个bit,即1010
在生成order_id时,先使用一种分布式ID生成算法生成前60bit
将分库基因加入到order_id的最后4个bit
拼装成最终的64bit订单order_id
这样保证了同一个用户发布的所有订单的order_id,都落在同一个库上,order_id的最后4个bit都相同,于是通过user_id%16也能定位到库、通过order_id%16能够定位到库
php代码示例,其他语言ai转一下
<?php
class OrderService {
// 获取分库基因(最后4位bit)
private function getShardKey($userId) {
$binary = decbin($userId);
$last4Bits = substr($binary, -4);
return bindec($last4Bits);
}
// 获取目标库编号(0-15)
public function getTargetShard($userId) {
return $userId % 16;
}
// 生成64位订单ID(前60位分布式ID+后4位分库基因)
public function generateOrderId($userId) {
// 这里使用时间戳+随机数模拟分布式ID生成(实际生产环境应使用雪花算法等)
$timestamp = time() * 1000;
$random = rand(1000, 9999);
$distributedId = $timestamp . $random;
// 转换为64位二进制(前60位)
$binary = decbin($distributedId);
$first60Bits = substr($binary, 0, 60);
// 获取分库基因
$shardKey = $this->getShardKey($userId);
$last4Bits = decbin($shardKey);
// 拼装完整64位订单ID
$orderId = $first60Bits . $last4Bits;
return $orderId;
}
}
// 使用示例
$userId = 666;
$orderService = new OrderService();
// 获取目标库编号
$shardId = $orderService->getTargetShard($userId);
echo "目标库: " . $shardId . "\n";
// 生成订单ID
$orderId = $orderService->generateOrderId($userId);
echo "订单ID: " . $orderId . "\n";