主键策略 之 自增长,UUID, Redis生成和snowflake总结比较

2,495 阅读2分钟

主键是什么

在使用database的时候,我们的每一行都代表着一份数据,每一列都是不同的字段,大多数情况下,我们查找数据库时,会发现我们很多记录的字段内容是重复的,这会给我们的查找造成困难,所以我们需要主键,即primary key,这个主键所在的字段,能确保每个数据对于的字段内容都是唯一的。有时候database没有主键时,会自动生成主键。

例如下方的数据库,分别由不同的字段id,name,age,email构成。此时我们可以把id设成主键,这样没有任何人能共用一份id,而他们却可以拥有相同的姓名,年龄和邮箱

id name age email
1 Jack 18 jack@gmail.com
2 Sam 19 sam@gamil.com
3 Lucy 20 lucy@gmail.com

主键策略

自动增长 (Auto Increment)

自动增长策略即字面意思,主键的数值会随着生成的时间逐渐增大,比如第一份数据生成时获得的id为1,第二份为2,以此类推。
优点:简单方便,易于理解。
缺点:分表操作时,下一张表需要知道上一张表最后的id。

UUID (通用唯一识别码 Universally Unique Identifier)

uuid也是所有接触过database的人基本上都会遇见的名词了,uuid即每次都随机生成的唯一值,UUID的格式一般为4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长。例:550e8400-e29b-41d4-a716-112233445566。
优点: 全球唯一,非常安全
缺点:无序,需要空间大,每个id都是36个字节

Redis生成id

redis是单线程的且原子操作的,所以当我们使用不同步长时,我们也可以生成唯一的id 假设我们有3个redis,初始化每个redis起始值为1,2,3,步长为3,则生成id为: A:1,4,7... B: 2,5,8... C: 3,6,9...

优点:唯一且灵活
缺点:需要引入redis组件

snowflake算法

使用41bit作为毫秒数,10bit为机器id,这10bit中5bit代表数据中心,5bit为机器id,12bit为毫秒内的流水号,即当前id是当前这一毫秒内的第几个,最后一位永远是0。因为引入了毫秒,流水号和机器号,使得snowflake算法也能获得唯一id。

优点:不依赖数据库,在时间上有序
缺点:不同机器的时间可能不同或有时差,所以使用不同机器时可能不会是全局递增