php接收分片数据,数据库分片id的设计(PHP实例)

分片是在大型网站数据库设计中经常会用到的解决方法,本文尝试给出一种用PHP实现的设计方案,shard_id的结构是64bit,10bit sharid系统+10bit为类型id+10子类型id+34bit自增id。关于分片设计的更多知识请参考我的其它文章。

database = load( 'database' ); } function get_shard_id( $table_name, $cate_id, $subcate_id ) { return $this->gen_shard_id( $this->get_next_id( $table_name ), $cate_id, $subcate_id ); } /** * 生成shared id * * ID的结构: * 一共64位,10位shard_id,10位类型id,10位子类型id,34位自增id * 10 bits shard_id,10 bits cate_id,10 bits subcate_id,34 auto increment id * 10+10+10+34 * * @param $next_auto_increment_id required 自增id * @param $cate_id required 类型id * @param $subcate_id optional 子类型id * * @return bigint */ function gen_shard_id( $next_auto_increment_id, $cate_id, $subcate_id ) { if( empty( $next_auto_increment_id ) ) { return 0; } $shard_id = $this->get_shard_num( $next_auto_increment_id, TOTAL_SHARD_NUM ); $shard_id = $shard_id << ( 64 - 10 ); //shard id $shard_id |= $cate_id << ( 64 - 10 - 10 ); //大类型 $shard_id |= $subcate_id << ( 64 - 10 - 10 - 10 ); //子类型 $shard_id |= $next_auto_increment_id; //自增id return $shard_id; } /** * 解析 shard id 结构 * * ID的结构: * 一共64位,10位shard_id,10位类型id,10位子类型id,34位自增id * 10 bits shard_id,10 bits cate_id,10 bits subcate_id,34 auto increment id * 10+10+10+34 * * @param $shard_id * * @return array('shard_num'=>0,'cate_id'=>0,'subcate_id'=>'','id'=>0) */ function parse_shard_id( $shard_id ) { $ret = array( 'shard_num' => 0, 'cate_id' => 0, 'subcate_id' => 0, 'id' => 0 ); if( empty( $shard_id ) ) { return $ret; } $ret[ 'shard_num' ] = $shard_id >> ( 64 - 10 ); $ret[ 'cate_id' ] = ( $shard_id >> ( 64 - 10 - 10 ) ) & 1023; $ret[ 'subcate_id' ] = ( $shard_id >> ( 64 - 10 - 10 - 10 ) ) & 1023; $ret[ 'id' ] = $shard_id & 17179869183; return $ret; } /** * get shard location * * @param $next_auto_increment_id * @param $total_shard_num * * @return int */ function get_shard_num( $next_auto_increment_id, $total_shard_num ) { return $next_auto_increment_id % $total_shard_num; } /** * 查询表的下一个自增id * * @param $table_name * * @return int */ function get_next_id( $table_name ) { if( empty( $table_name ) ) { return 0; } // // need grant access information_schema privilege // $sql = "SELECT auto_increment FROM information_schema.tables WHERE table_name = '$table_name' AND table_schema = DATABASE()"; /** @var CI_DB_Result $query */ $data = $this->database->unique( $sql ); if( !empty( $data ) ) { return isset( $data[ 'auto_increment' ] ) ? $data[ 'auto_increment' ] : 0; } else { return 0; } } }

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值