上一篇
场景引入:
小明最近在开发一个用户系统,需要为每个新用户分配唯一的ID,他听说Redis的自增命令很方便,但团队暂时没有Redis环境😅,难道没有Redis就搞不定自增主键了?别急,今天我们就来聊聊完全不依赖Redis的自增主键实现方案!
自增主键(Auto Increment ID)是数据库中的常客,它的核心优势:
但传统方案(如MySQL的AUTO_INCREMENT
)在分布式系统中可能遇到瓶颈,这时候就需要一些"骚操作"了💡
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) );
适用场景:单机服务、小型项目
优点:简单到哭😭,数据库自带功能
缺点:分库分表时可能重复(不同库的自增序列独立)
PostgreSQL玩家可以这样玩:
CREATE SEQUENCE user_id_seq START 1; INSERT INTO users VALUES (nextval('user_id_seq'), '小明');
优点:比单纯的自增列更灵活
缺点:MySQL不支持(但可以用函数模拟)
String uuid = UUID.randomUUID().toString(); // 输出类似 "f47ac10b-58cc-4372-a567-0e02b2c3d479"
优点:全球唯一,分布式友好
缺点:
2025年依然流行的分布式ID方案:
0 | 0001100 10100010 10111110 10001001 01011100 00 | 10001 | 00001 | 000000000000
↑ ↑ ↑ ↑ ↑ ↑
符号位 时间戳(41位) 数据中心ID 机器ID 序列号
Java实现片段:
long id = ((timestamp << 22) | (datacenterId << 17) | (machineId << 12) | sequence);
优点:
CREATE TABLE id_segments ( biz_tag VARCHAR(128) PRIMARY KEY, max_id BIGINT NOT NULL, step INT NOT NULL );
优点:减少数据库访问压力
缺点:服务重启可能导致ID段浪费
方案 | 适合场景 | 是否需要额外依赖 |
---|---|---|
数据库原生自增 | 单机应用 | ❌ 不需要 |
雪花算法 | 分布式系统 | ❌ 不需要 |
数据库分段 | 高并发但允许少量ID浪费 | ❌ 不需要 |
用户ID=分库编号+自增ID
) 没有Redis?完全不是问题!从单机的AUTO_INCREMENT
到分布式的雪花算法,选择适合你业务场景的方案即可,2025年的今天,我们有了更多轻量级的选择,关键是要理解每种方案的适用边界。
下次遇到自增主键需求时,不妨自信地说:"这次我们不用Redis!" 💪
(本文技术方案参考2025年8月主流数据库文档及开源项目实践)
本文由 简鹏天 于2025-08-04发表在【云服务器提供商】,文中图片由(简鹏天)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/538108.html
发表评论