分表分库-基因分片法

用户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";

posted @ 2025-07-10 09:43  朝阳1  阅读(56)  评论(0)    收藏  举报