簡介
隨著微服務框架的逐步應用,分布式id生成策略要支援高併發、有序性、易讀性。常用方案有uuid、guid、redis、mongodb等,本次只提供資料庫生成方式。作為平台框架基於適配原則提供資料庫層面的選擇,以下為具體的設計。
可適用於id持續增長,固定編碼長度,不足補零。
可適用於每天、每月、每年階段性的清零自增長。
可指定編碼的字首、字尾。
階段性的清零操作無需定時任務。
建立表結構
create table `tb_ids` (
`id` int(11) default null comment '編碼',
`object` varchar(100) default null comment '物件',
`segment` varchar(100) default null comment '切分段落',
`prefix` varchar(10) default null comment '字首',
`format` varchar(50) default null comment '段落格式',
`length` int(11) default null comment '數字長度',
`sequence` int(11) default null comment '當前序列',
`suffix` varchar(10) default null comment '字尾',
`type` int(11) default null comment '型別[1:持續累計;2:階段性累計]'
) engine=innodb default charset=utf8;
初始化資料
指定字首,按日重新累計;
指定字首,從1開始一直累加;
指定字首,按年月重新累計;
指定字首,按兩位年份重新累計;
insert into `tb_ids` values ('1', 'order', '20180629', 'r', '%y%m%d', '6', '0', '', '2');
insert into `tb_ids` values ('2', 'user', null, 'u', '', '6', '0', '', '1');
insert into `tb_ids` values ('3', 'sale', '201806', 'so', '%y%m', '6', '0', '', '2');
insert into `tb_ids` values ('5', 'year', '18', 'y', '%y', '6', '0', '', '2');
建立函式
create function `sequnce`(in_object varchar(50)) returns varchar(200) charset utf8
begin
#定義下個編碼變數
declare next varchar (100);
#定義是否同段內的編碼,如果不是從1開始。
declare is_same_segment tinyint (1);
#如果是連續遞增的編碼,設定為是同一段的編碼
select
(t.type = 1 ) into is_same_segment
from
tb_ids t
where
t.object = in_object ;
#如果不是連續遞增的編碼,查詢現在時間和上次編碼生成時間是否同乙個段落
if (!is_same_segment) then
select
t.segment = date_format(now(), t.format) into is_same_segment
from
tb_ids t
where
t.object = in_object ;
end if;
#更新編碼,如果統一段落加一,否則從一開始;更新此次編碼生成的段落;
update tb_ids t
set t.sequence = (
case
when !is_same_segment then # 不同段落從1開始
else # 相同段落累計
sequence + 1
endt.segment = date_format(now(), t.format)
where
object = in_object ;
# 根據字首、段落、序號,字尾生成編碼
select
concat(
ifnull(t.prefix,''),#字首
ifnull(date_format(now(), t.format),''),#段落
lpad(sequence, t.length, 0),#序列
ifnull(t.suffix,'')#字尾
) into next
from
tb_ids t
where
t.object = in_object ;
return next;
end測試
image.png
mysql生成隨機id
mysql中生成隨機id的函式是uuid 但是這樣生成出來的隨機id是36位帶 符號的。select uuid 37747019 90a2 11e9 9806 00505683703f 我們可以配合replace 函式替換掉 符號來生成32位的不帶 符號的隨機id。select replace uu...
MySql唯一ID生成
前陣子,一直在折騰阿里雲。寫的一些文章也放到自己的wordpress部落格上了。但自己前陣子在做系統更換操作的時候未備份磁碟,大部分心血付諸東流。真是乙個悲傷的故事。現在決定用.net搞搞自己的部落格。正好把wordpress給拋棄掉。言歸正傳,這個唯一號類似自增id,自增id雖然好用,但進行資料庫...
es手動生成id和自動生成id
1.es手動指定document id 1.根據應用情況來說,是否滿足手動指定document id的前提 一般來說,是從某些其他的系統中,匯入一些資料到es時,會採取這種方式。就是使用系統中已有的資料的唯一標識,作為es中 document的id.舉個例子,比如說,開發乙個電商 做搜尋功能,或者o...