大區中分配玩家唯一ID的辦法 續

2021-12-30 10:01:53 字數 1502 閱讀 7419

大區中分配玩家唯一id的辦法(續)

相關鏈結:

大區中分配玩家唯一id的辦法

之前因為時間匆忙,大區里產生唯一id只是簡單寫了乙個方法,今天趁著有時間,把裡面一些過程寫出來,也算是個總結。  www.2cto.com  

首先說說需求,現在遊戲裡資料庫為了分散熱點,都採用分表方式,以前那種一張表auto_increment的方式顯然不行了,那麼將唯一id放到業務程序裡可行嗎?這個也不好,因為現在後台都是多個部署,每個程序可以保證id唯一,但是存到資料庫的時候就可能重複,所以我們還是得在db上做文章。

因此就有了上篇文章的解決方案,單獨一張表,這張表的作用就是專門產生唯一id,而且為多個業務提供唯一id,多程序情況下也不需要鎖表,效率比較高,是不是很像設計模式裡的工廠。接著我來分析下這張表。我們再來看看表結構和用法

create table seqtab ( 

iseqno bigint(20) not null default 0,   //表示唯一id

iseqtype int(11) not null default 0,   //表示業務id

primary key(iseqno,iseqtype));

insert into seqtab values(0,1);        //初始化,假設乙個業務編號為1

update seqtab set iseqno=last_insert_id(iseqno+1) where iseqtype=1;

select last_insert_id();                   //這兩句是獲取乙個業務的唯一id,供業務程序使用。

其實說到這張表,關鍵是說last_insert_id()這個方法。它有兩種形式last_insert_id(),last_insert_id(expr)。

這個東西的特點是,1.屬於每個connection,connection之間相互不會影響 2.不屬於某個具體的表 3.返回最後一次insert auto_increment的值 4.假如以此使用insert插入    多行資料,只返回第一行資料產生的值 5.如果你update某個auto_increment的值,不會影響last_insert_id()返回值

last_insert_id(expr)與last_insert_id()稍有不同,首先它返回expr的值,其次它的返回值會記錄在last_insert_id()。

我們這裡主要使用到了第一和第二個特點,每個程序併發執行update seqtab set iseqno=last_insert_id(iseqno+1) where iseqtype=1;,就獲取屬於程序自己的iseqno並且記錄在 last_insert_id中,通過第二句取出該值。   

接著我們在比較下其他一些辦法。

第一種是直接一張表,裡面有乙個id欄位,設定成auto_increment。這個的問題是每個業務id不是連續的,是離散的。

第二種是使用guid或者uuid,但是這個問題我個人覺得是效率上的差異,字串沒有數字的效率好,另外數字id今後也可以拼接一些區資訊,之後跨區的時候可以方便獲取物件是哪個區的.

大區中分配玩家唯一ID的辦法 續

之前因為時間匆忙,大區里產生唯一id只是簡單寫了乙個方法,今天趁著有時間,把裡面一些過程寫出來,也算是個總結。首先說說需求,現在遊戲裡資料庫為了分散熱點,都採用分表方式,以前那種一張表auto increment的方式顯然不行了,那麼將唯一id放到業務程序裡可行嗎?這個也不好,因為現在後台都是多個部...

全域性唯一遞增的id 趨勢有序的全域性唯一ID

常見方法 不足與優化 常見方法一 使用資料庫的 auto increment 來生成全域性唯一遞增id 優點 1 簡單,使用資料庫已有的功能 2 能夠保證唯一性 3 能夠保證遞增性 4 步長固定 缺點 1 可用性難以保證 資料庫常見架構是一主多從 讀寫分離,生成自增id是寫請求,主庫掛了就玩不轉了 ...

怎樣生成唯一的ID

作為乙個web開發者應該知道這裡的users後面的那串 066ab87a062b 必定是我的id,這個id肯定是唯一的。這就是今天要討論的,怎樣生成唯一的id?如果你是乙個初級的web開發者,那麼你可能不會去生成這種唯一的id,因為有乙個很簡單的方法已經幫我們搞定了這個事情,那就是資料庫。這個時候我...