從Redis生成資料表主鍵標識

2022-02-25 01:12:57 字數 2081 閱讀 8697

對於mysql的全域性id(主鍵),我們一般採用自增整數列、程式生成guid、單獨的表作為id生成器,這幾種方案各有優劣,最終效率都不能說十分理想(尤其海量資料下),其實通過redis的incr可以很方便生成自增數,因為是操作快取,生成的效率也不錯。 

插入資料庫的主鍵也是連續增長的,配合索引,讀取效率也很高。

下面是從redis中獲取新的自增數的**:

public

sealed

class

utils

return (int

)value;}}

}

我的專案用的repository模式,所以獲取新主鍵的方法我寫到repository父類中(在介面irepository中有定義),這樣各個repository可以過載屬性tablename,當然你完全可以把newidentity獨立出去作為公共方法,只要傳入tablename即可

public

abstract

class

repositorybase : irepository

protected

virtual

string tablename

public

virtual

intnewidentity()

.id"; //

eg. sequence_lottery.id, sequence_player.id

var id = utils.newsequencefromredis(rediskey, () =>);

return

id; }

}

下面是測試**,並且用stopwatch測試每次執行效率:

using (var ctx = di.resolve())

, elapsed: ms

", userid, sw.elapsedmilliseconds);

sw.restart();

var gameid = ctx.resolve().newidentity();

sw.stop();

console.writeline(

"gameid=, elapsed: ms

", gameid, sw.elapsedmilliseconds);

sw.restart();

var roomid = ctx.resolve().newroomidentity();

sw.stop();

console.writeline(

"roomid=, elapsed: ms

", roomid, sw.elapsedmilliseconds);

sw.restart();

var betitemid = ctx.resolve().newbetitemidentity();

sw.stop();

console.writeline(

"betitemid=, elapsed: ms

", betitemid, sw.elapsedmilliseconds);

sw.restart();

var lotteryid = ctx.resolve().newidentity();

sw.stop();

console.writeline(

"lotteryid=, elapsed: ms

", lotteryid, sw.elapsedmilliseconds);

//省略的**。。。

}

執行結果如下,除第一次獲取主鍵開銷98毫秒(估計建立redis連線有關),後面的幾乎都是0毫秒(redis本來就飛快,這裡不用考慮資料庫連線開閉的時間消耗)

檢視redis中的鍵值:

當然,**還需要完善,比如redis掛了的情況,id主鍵可以讀取max(id)+1來替代主鍵生成,但是redis又恢復後,自增數怎麼同步

Django ORM框架 生成資料表

databases 需要注意的是,django連線sql需要安裝mysqlclient模組。進入虛擬環境,輸入命令pipenv install mysqlclient。我們先使用django自帶的sqlite3資料庫來學習。不需要修改配置檔案。資料庫 需要手動建立資料庫 資料表 與orm中的模型類 ...

根據Django Model動態生成資料表的方法

當定義好django model後,一般可以在初始化呼叫syncdb方法來自動在資料庫裡面生成相應的表。那麼如果想在後續階段想根據根據django model動態生成資料表,該怎麼辦呢?要生成資料庫表,就得先根據model的定義先生成sql語句,然後在資料庫裡面執行。並且由於要支援不同的資料庫,所生...

SQL取資料表主鍵

1 select table name,column name from information schema.key column usage where table name dtproperties 2 exec sp pkeys table name 表名 3 select o.name a...