在我们的工作中,经常会遇到需要生成ID的场景,比如全链路日志中标识唯一请求或者说唯一链路的ID,用户注册过程中给用户分配的唯一账号ID,交易过程中的幂等值等。下面就说说几种常见的ID生成方法,也就是Id Maker的实现方案。
1. 数据库auto increment
我们很容易的想到,数据库中auto increment就是为了生成唯一主键ID的,而且数据库的ACID特性,保证该过程肯定是原子的,原子的意思就是不会有ID冲突即有两个ID生成的一模一样。该方法对于生成ID不是很频繁的场景还是比较适用的,一般是生成请求在几千次/s的情况下。
2. 使用redis自增命令
redis有个incrby的命令,通用点的叫法就是计数器,其实这种思路与mysql的自增并没有什么分别,不过因为存储方式的原因,使用redis做id maker可以在单位时间内生成更多的ID,redis的性能都是10W/s的。不过使用redis没有使用mysql那么简单,它需要在业务层面做一些保护。
1 | 唯一ID:id(每次生成的ID) |
3. UUID算法
该算法比较常见,不过生成的ID不是数字,也不具备单调递增的特性,这种ID生成方法比较适用于对于ID没有单调性要求的分布式日志唯一ID。
4. SnowFlake算法
可以理解为分段算法,64bit的整数,分为时间戳、机器、序列号等段,可以满足一段号段内的递增属性,该ID算法生成的ID范围很大,基本上用不完,是比较常用的一种算法。