ID生成方法有哪些,不同场景如何选工具
ID生成基本概念
ID生成就是创建能唯一标识某个对象的字符串或数字,在数字世界里,它就像每个数据的“身份证”,没有它,信息就会在系统里乱成一锅粥,不管是用户账号、订单编号,还是文件名称,都得靠ID来区分谁是谁,我最早接触ID生成是在做一个学生信息管理系统时,当时用Excel表格手动编学号,后来才发现系统自动生成ID能省不少事,还不会重复。
ID生成的核心目标是唯一性,也就是说不管生成多少个ID,都不能有两个一模一样的,其次可能还需要考虑有序性、长度、安全性这些,比如日志系统的ID最好按时间排序,方便查找;用户ID最好别用简单数字,防止被人猜到规律。
常见ID生成方法
最基础的是数据库自增ID,在MySQL里设置主键自增,插入数据时系统会自动生成1、2、3这样的数字ID,这种方法简单到不用额外写代码,我之前帮朋友做小博客时就用这个,用户量小的时候完全够用,但它有个大问题,要是系统变成分布式的,多台数据库服务器一起生成ID,就会重复,像两个班级都按1、2、3排学号,合并时就乱套了。
UUID是另一种常见方法,全称是通用唯一识别码,长得像“550e8400-e29b-41d4-a716-446655440000”,由32个字符组成,它通过时间戳、机器MAC地址、随机数这些信息生成,理论上全球唯一,不用依赖数据库,我试过用Python的uuid库生成UUID,一行代码就能搞定,但字符串太长,存数据库时索引效率低,看着也费劲。

雪花算法是分布式系统的“明星选手”,生成的是64位整数ID,前41位是时间戳,中间10位是机器ID和数据中心ID,最后12位是序列号,这样既保证了唯一性,又能按时间排序,还能反推出ID生成的时间,我公司的订单系统就用这个,多台服务器各自生成ID,从没出现过重复,性能也很强,每秒能生成几十万甚至上百万个ID。
还有Redis自增ID,通过Redis的INCR命令实现,每次调用就加1,Redis是单线程的,不会出现并发冲突,适合分布式系统,我之前做秒杀活动时用过,商品库存ID用Redis自增,响应速度快,还能设置过期时间,防止ID无限增长,不过得保证Redis服务器稳定,要是宕机了,ID生成就卡住了。
ID生成工具推荐
在线工具里,UUID Generator网站挺好用,打开网页就能生成各种版本的UUID,支持复制粘贴,不用下载软件,适合临时用,我上次帮同事生成测试数据的ID,直接在上面生成了100个UUID,免费又方便,就是生成太多时页面会有点卡。
编程工具的话,Java开发者可以试试hutool工具包,里面封装了雪花算法、UUID等多种ID生成方式,调用方法简单,我写Java项目时,引入hutool后,用Snowflake snowflake = new Snowflake(1, 0);就能创建雪花算法实例,nextId()方法直接生成ID,省去自己写算法的麻烦。
Python开发者可以用snowflake-id库,安装命令是pip install snowflake-id,使用时导入模块,设置worker_id和datacenter_id,调用generate_id()就行,我之前用它给爬虫生成任务ID,生成速度快,还能自定义机器ID,适合多线程场景。
数据库工具里,MySQL的自增主键最常用,建表时设置id INT PRIMARY KEY AUTO_INCREMENT,插入数据时不用管ID,系统自动生成,PostgreSQL也有类似的SERIAL类型,用法差不多,这些都是数据库自带的功能,不用额外配置,小项目首选。
Redis作为工具时,直接用命令行调用INCR key就行,比如INCR user_id,返回的就是新的用户ID,还能结合EXPIRE设置过期时间,防止key占用内存,我在做分布式锁时顺便用Redis生成ID,一举两得,就是得注意Redis的持久化,万一数据丢了,ID可能会重复。
不同场景的ID生成方案
单机小系统选数据库自增ID最划算,像个人博客、小型企业官网,用户量不大,数据量少,数据库自增简单稳定,维护成本低,我之前给小区物业做报修系统,就用MySQL自增ID当报修单编号,两年了没出过问题,物业阿姨都觉得操作简单。
分布式系统必须上雪花算法或Redis自增,比如电商平台的订单系统,多台服务器同时处理订单,用雪花算法能保证每个订单ID唯一,还能按下单时间排序,方便后续数据分析,我朋友公司的支付系统用Redis自增ID,搭配主从复制,就算主节点挂了,从节点能顶上,可用性高。
需要短ID的场景适合Base62编码,比如URL缩短服务,把长ID转成由数字、大小写字母组成的短字符串,我试过把123456789转成Base62,结果是“8M0kX”,长度从9位缩短到5位,用户分享链接时更方便,不过编码前要保证原始ID唯一,不然编码后也会重复。
安全性要求高的场景得用加密ID,比如用户ID,别用自增数字,防止被人猜测规律,可以把自增ID通过AES加密,或者用哈希算法加盐处理,我之前做社交APP时,用户ID就是用自增ID加密后的字符串,别人就算看到ID也猜不出总用户量,还能防止恶意注册。
ID生成注意事项
唯一性是底线,ID一旦重复,系统就会出大问题,我见过一个电商平台因为ID重复,两个用户的订单信息混在一起,导致发货错误,赔了不少钱,所以生成ID后一定要测试,多线程、多服务器环境下跑一跑,看看有没有重复。
有序性根据场景选,日志系统、订单系统最好有序,方便按时间排序查询;用户ID、随机令牌这些就不用有序,无序反而更安全,我之前做日志系统时,ID用的是带时间戳的雪花算法,查问题时按ID排序就能看到事件发生顺序,效率很高。
长度别太长,ID太长会占用更多存储空间,传输时也费流量,数据库索引性能还会下降,UUID虽然唯一,但32个字符太长,我一般只在没办法的时候用,能用短ID就尽量用短ID。

性能要跟上,高并发场景下,ID生成速度不能拖后腿,雪花算法每秒能生成上百万个ID,Redis自增也很快,适合秒杀、直播这些流量大的场景,要是用UUID,生成速度虽然也快,但字符串处理耗时,得提前测试性能。
别泄露敏感信息,比如用用户ID当订单ID,别人一看就知道用户的注册顺序;用自增ID当商品ID,能猜到商品总数,我之前做的一个系统就犯过这错,商品ID用自增数字,被竞争对手通过ID猜到我们的商品数量,后来换成加密ID才解决。
主流ID生成工具对比
UUID生成器和雪花算法比,UUID优势是不用依赖任何服务,本地就能生成,适合离线场景;缺点是字符串长、无序、索引性能差,雪花算法优势是有序、整数ID、性能高、适合分布式,缺点是依赖机器时钟,时钟回拨时可能生成重复ID,我公司的分布式系统选雪花算法,就是看中它的有序性和高性能。
数据库自增ID和Redis自增ID比,数据库自增优势是简单、不用额外组件、适合单机;缺点是分布式下冲突、单点风险,Redis自增优势是支持分布式、性能高、可设置过期时间;缺点是依赖Redis服务,宕机时影响ID生成,小系统选数据库自增,分布式系统选Redis自增更靠谱。
雪花算法和Redis自增比,雪花算法优势是ID里包含时间戳和机器信息,可追溯;缺点是配置机器ID麻烦,时钟回拨难处理,Redis自增优势是实现简单,调用命令就行;缺点是ID是纯数字,没有业务含义,需要追溯ID生成信息的选雪花算法,追求简单的选Redis自增。
短ID生成工具(如Base62编码)和UUID比,短ID优势是长度短、易传播;缺点是需要原始ID唯一,编码过程多一步,UUID优势是直接生成、无需原始ID;缺点是太长,URL缩短、邀请码这些场景选短ID,离线、不关心长度的场景选UUID。
ID生成实操步骤
以雪花算法为例,第一步是配置机器ID和数据中心ID,机器ID区分不同服务器,数据中心ID区分不同机房,加起来10位,最多支持1024台服务器,我公司有5台应用服务器,机器ID设为0-4,数据中心ID设为0,这样每台服务器生成的ID都不一样。
第二步是引入雪花算法库,Java用hutool的话,在pom.xml里添加依赖,然后创建Snowflake实例:Snowflake snowflake = new Snowflake(机器ID, 数据中心ID);,我写代码时会把机器ID和数据中心ID配在配置文件里,方便后期调整,不用改代码。
第三步是生成ID,调用snowflake.nextId()方法就行,返回的是long类型整数,我在订单系统里,用户下单时就调用这个方法生成订单ID,然后存到数据库,测试时我用多线程循环生成了100万个ID,没出现重复,性能也没问题。
第四步是处理时钟回拨,雪花算法依赖系统时钟,要是时钟往回拨,可能生成重复ID,我公司的做法是检测到时钟回拨时,等待时钟追上上次生成ID的时间,或者记录日志报警,人工处理,一般服务器时钟不会回拨,除非人为调整,所以提前做好监控很重要。
常见问题解答
ID生成有哪些常用方法
常用的有数据库自增ID、UUID、雪花算法、Redis自增ID,数据库自增简单适合小系统,UUID全球唯一但字符串长,雪花算法适合分布式系统有序且高性能,Redis自增支持分布式且速度快,选的时候看系统是单机还是分布式,要不要有序,长度有没有要求,根据场景挑就行。
UUID和雪花算法哪个更好
看场景,UUID不用依赖服务,本地生成,适合离线或不需要有序ID的场景,但字符串长、索引性能差,雪花算法生成64位整数ID,有序、能追溯时间,适合分布式系统,性能也强,但依赖机器时钟,时钟回拨可能出问题,分布式系统选雪花算法,小系统或离线场景选UUID更方便。
ID生成需要注意什么
首先保证唯一性,ID重复系统会出大问题,生成后一定要多环境测试,然后看有序性,日志、订单系统有序方便查询,用户ID无序更安全,长度别太长,太长占空间影响性能,还要注意别泄露敏感信息,比如用户ID别用自增数字,防止被猜规律,能加密就加密。
免费的ID生成工具有哪些
在线工具推荐UUID Generator网站,能直接生成UUID,免费又方便,编程用的话,Java有hutool工具包,里面有雪花算法、UUID实现;Python有snowflake-id库,都是开源免费的,数据库自带的自增ID也不用花钱,Redis的INCR命令生成ID也免费,手头有啥工具就用啥,省钱又实用。
分布式系统怎么生成唯一ID
分布式系统推荐用雪花算法或Redis自增ID,雪花算法通过时间戳、机器ID、序列号生成唯一ID,支持多服务器,有序且性能高,Redis自增用INCR命令,单线程不冲突,响应快,还能设置过期时间,也可以用数据库分库分表时设置不同起始值和步长,比如A库ID1、3、5,B库ID2、4、6,但配置麻烦,不如前两种方便。


欢迎 你 发表评论: