单体架构中,通常是单库单表的结构。此时表中实体的ID一般从1开始自增。但是在分布式架构中,通常使用分库分表设计,使得多个库或多个表存储相同的业务实体,此时如果使用数据库自增ID就会出现产生相同ID的问题,无法保证主键的唯一性。
实现
Redis
通过Redis的INCR或INCRBY命令(原子性)以及Redis的单线程特性,可以保证生成的ID的是唯一有序的。
以64位(long)整形ID为例,常见ID结构为:
符号位(1位)+时间戳(31位)+序列号(32位)
此时Key可以设置成时间的层级结构,比如:
id:2026:01:01表示每天重置ID自增计数器,防止自增ID过大。