背景
我们业务需要一个递增主键,返回长度是long,从1开始增加,允许部分丢失,保证全局递增就行。数据库是mysql
思路1
使用mysql的自增主键,或者模拟oracle的自增主键,不管什么可以保证自增就行。好处:简单。坏处:并不能保证丢失数据,并且每次获取都要读数据库,增加IO操作
思路2
基于思路1,考虑异步加载数据,使用一张表,异步修改表字段的当前值,内存中加载区间值,放在内存中。好处:保证获取值速度,支持高并发。坏处:重新启动项目会丢失已经加载到内存的数据。
问题
我就要保证不丢失自增数据,要不要做?
回答
丢了自增数据,必须保证自增连续性,不能有丢失,重要吗?重要吗?重要吗?自己问三遍,你会有答案。
网上说使用美团的思路,使用雪花算法等等,但是自增跨度有点大,如果你是需要全局递增的,并且很在乎自增连续性,可以使用雪花算法,网上一堆源代码,这里不啰嗦了。
好了,言归正传。咱们采取思路2怎么做。
1:mysql建表语句
CREATE TABLE `TC_SEQUENCE` (
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
COMMENT '主键',
`NAME` VARCHAR(50) NOT NULL
COMMENT '名称',
`CURRENT_VALUE` BIGINT(20) DEFAULT 0,
`INCREMENT` INTEGER NOT NULL DEFAULT '1'
COMMENT '增量',
`TOTAL` INTEGER NOT NULL DEFAULT '1000'
COMMENT '单次取值总量,更新总量需重启应用',
`THRESHOLD` INTEGER NOT NULL DEFAULT '1000'
COMMENT '刷新阈值,更新阀值需重启应用,还剩多少,进行刷新',
`MAX_VALUE` BIGINT(20) DEFAULT 0
COMMENT '最大取值',
UNIQUE INDEX UIDX_NAME(`NAME`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8
comment ='序列号';
--初始化数据,自增值,total&threshold自己可以定义
INSERT INTO tc_sequence (`NAME`, `CURRENT_VALUE`, `INCREMENT`, `TOTAL`, `THRESHOLD`, `MAX_VALUE`)
VALUES ('1', 1, 1, 1000, 100, 999999999999);
INSERT INTO tc_sequence (`NAME`, `CURRENT_VALUE`, `INCREMENT`, `TOTAL`, &