一、用户表结构
在mysql数据库中创建user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`username` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
`password` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(64) COLLATE utf8mb4_general_ci,
`gender` tinyint(4) NOT NULL DEFAULT '0',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`) USING BTREE,
UNIQUE KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
二、雪花算法生成用户ID
分布式ID生成器
分布式ID的特点
递增性:确保⽣生成ID对于⽤用户或业务是递增的。
⾼高可⽤用性:确保任何时候都能⽣生成正确的ID。
⾼高性能性:在⾼高并发的环境下依然表现良好。
使用场景
不不仅仅是⽤用于⽤用户ID,实际互联⽹网中有很多场景需要能够⽣生成类似MySQL⾃自增ID这样不不断增⼤大,同时⼜又
不不会重复的id。以⽀支持业务中的⾼高并发场景。
⽐比较典型的场景有:电商促销时短时间内会有⼤大量量的订单涌⼊入到系统,⽐比如每秒10w+;明星出轨时微
博短时间内会产⽣生⼤大量量的相关微博转发和评论消息。在这些业务场景下将数据插⼊入数据库之前,我们需
要给这些订单和消息先分配⼀一个唯⼀一ID,然后再保存到数据库中。对这个id的要求是希望其中能带有⼀一
些时间信息,这样即使我们后端的系统对消息进⾏行行了了分库分表,也能够以时间顺序对这些消息进⾏行行排
序。
雪花算法
雪花算法介绍
SnowFlake算法在同⼀一毫秒内最多可以⽣生成多少个全局唯⼀一ID呢?
同⼀一毫秒的ID数量量 = 1024 X 4096 = 4194304,因此爆破是几乎不可能的。
雪花算法的go实现
github.com/bwmarrin/snowflake是一个轻量级的snowflake的Go实现。
package main
import (
"fmt"
"time"
"github.com/bwmarrin/snowflake"
)
var node *snowflake.Node
func Init(startTime string, machineID int64) (err error) {
var st time.Time
st, err = time.Parse("2006-01-02", startTime)
if err != nil {
return
}
snowflake.Epoch = st.UnixNano() / 1000000
node, err = snowflake.NewNode(machineID)
return
}
func GenID() int64 {
return node.Generate().Int64()
}
func main() {
if err := Init("2020-07-01", 1); err != nil {
fmt.Printf("init failed, err:%v\n", err)
return
}
id := GenID()
fmt.Println(id)
}
标签:err,Bluebell,snowflake,用户,ID,user,NULL,id
From: https://www.cnblogs.com/iruan/p/18427496