一、分布式唯一ID
1、为什么在分布式场景下有ID问题?
- 分布式下多个数据的ID有重复情况
- 并发请求写入的时候数据库自增主键性能差,提升写入性能
设置好步长和起始值
按范围划分如下:
按hash取模划分
生成唯一ID方案:
1、Redis 可以用incrby批量取存到内存

2、Twitter雪花算法 单秒能生成几十万的ID 且不重复
二、跨库查询
1、分组方案
比如order跟userid在用一个库

Laravel+mysql拆分方案设计
hash+全局表方案设计

CREATE TABLE `index_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(32) NOT NULL DEFAULT '',
`name` varchar(25) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8;
CREATE TABLE `user_xxx` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
`age` int(11) NOT NULL,
`sex` tinyint(1) NOT NULL,
`phone` varchar(11) NOT NULL DEFAULT '',
`password` varchar(55) NOT NULL DEFAULT '',
`uuid` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
$uuid = md5(uniqid(mt_rand(), true));
$uid = hexdec(substr($uuid, 0, 1)) % 4;
DbUtil::execRawSql("insert into index_user (`uuid`,name) values ('{$uuid}','cccccc')");
DbUtil::execRawSql("insert into user_{$uid} (name,age,sex,phone,password,`uuid`)values ('cccccc',11,1,'1111111','fadsfasdfasd','{$uuid}')");
查询
$name = 'cccccc';
$result = DbUtil::get("select uuid from index_user where name='$name'");
$uid = hexdec(substr($result['uuid'], 0, 1)) % 4;
$result=DbUtil::get("select * from user_{$uid} where uuid='{$result['uuid']}'");
var_dump($result);
文章讨论了在分布式系统中如何解决ID重复问题,提出了Redis的incrby方法和Twitter的雪花算法。同时,介绍了在Laravel+MySQL环境下,利用哈希和全局表进行数据拆分的跨库查询方案,以及具体的插入和查询操作示例。
2407

被折叠的 条评论
为什么被折叠?



